4.1.?建立WAL归档

一个运行中的UXDB系统产生一个无穷长的WAL记录序列。系统从物理上将这个序列划分成WAL 段文件,通常是每个16MB(段尺寸在配置UXDB时可修改)。段文件会被分配一个数字名称以便反映它在整个抽象WAL序列中的位置。在没有使用WAL归档时,系统通常只创建少量段文件,并且通过重命名不再使用的段文件为更高的段编号来“回收”它们。系统假设位于最后一个检查点之前的段文件的内容是无用的且可以被回收。

在归档WAL数据时,澳门游戏平台注册网站需要在每一个WAL段被写满时获取其内容,并且在段文件被回收重用之前保存该数据。依靠应用和可用的硬件,有很多不同的方法来保存数据:可以将段文件拷贝到另一台机器上的文件系统目录,或者将它们写出到一个磁盘驱动器(确保标识每个文件的原始文件名),或者将它们批量写入到CD上,或者其他方法。为了向数据库管理员提供灵活性,UXDB不对如何归档做任何假设。取而代之的是,UXDB需要数据库管理员声明一个shell命令将完整的段文件拷贝到需要的路径。该命令可以是简单的cp命令,也可以复杂到调用一个shell脚本。

要启用WAL归档,需设置wal_level配置参数为replica或更高,设置archive_mode为on,并且使用archive_command配置参数指定一个shell命令。实际上,这些设置总是被放置在uxsinodb.conf文件中。在archive_command中,%p会被将要归档的文件路径所替代,而%f会被文件名所替代(路径名是相对于当前工作目录而言的,即集群的数据目录)。如果需要在命令中嵌入一个真正的%字符,可以使用%%。最简单的命令类似于:

archive_command = 'test ! -f /home/uxdb/uxdbinstall/dbsql/bin/archivedir/%f && cp %p /home/uxdb/uxdbinstall/dbsql/bin/archivedir/%f'  # Linux
archive_command = 'copy "%p" "E:\\Program Files (x86)\\uxdb\\dbsql\\bin\\archivedir\\%f"'  # Windows

它将把 WAL 段拷贝到目录/home/uxdb/uxdbinstall/dbsql/bin/archivedir/(Linux)或者E:\\Program Files (x86)\\uxdb\\dbsql\\bin\\archivedir\\(Windows)(这个只是一个例子,并非建议的方法,可能不能在所有系统上都正确运行)。在%p和%f参数被替换之后,实际被执行的命令示例如下:

test ! -f /home/uxdb/uxdbinstall/dbsql/bin/archivedir/00000001000000A900000065 && cp ux_wal/00000001000000A900000065 /home/uxdb/uxdbinstall/dbsql/bin/archivedir/00000001000000A900000065

对每一个将要被归档的新文件都会生成一个类似的命令。

如果担心归档存储的尺寸过大,可以使用gzip来压缩归档文件:

archive_command = 'gzip < %p > /home/uxdb/uxdbinstall/dbsql/bin/archive/%f'

那么在恢复时将需要使用gunzip:

restore_command = 'gunzip < /home/uxdb/uxdbinstall/dbsql/bin/archivedir/%f > %p'

归档命令将在运行UXDB服务器的同一个用户的权限下执行。因为被归档的一系列WAL 文件包含数据库的所有东西,所以应该确保该用户的归档数据不会被别人窥探。 比如,归档到一个没有组或者全局读权限的目录里。

很多人选择使用脚本来定义archive_command,这样在uxsinodb.conf中该项非常简单:

archive_command = 'local_backup_script.sh "%p" "%f"'

任何时候如果希望在归档处理中使用多个命令,最好的方法是使用独立的脚本文件。允许使用流行的脚本语言来编写,例如bash或perl。

需要在脚本内解决的需求包括:

提示

在使用一个archive_command脚本时,最好启用logging_collector。任何从该脚本被写到stderr的消息将出现在数据库服务器日志中,这允许在复杂配置失败后能更容易诊断错误。

重要

当且仅当归档命令成功时,才返回零退出。在得到零值结果之后,UXDB将假设该文件已经成功归档,因此它稍后将被删除或者被新的数据覆盖;得到非零值表示该文件没有被归档,因此它会周期性地重试直到成功。

归档命令通常应该拒绝覆盖已经存在的归档文件。这是一个非常重要的安全特性,可以在管理员操作失误(比如把两个不同的服务器的输出发送到同一个归档目录)的时候保持归档的完整性。

建议首先测试使用到归档命令,以保证实际上不会覆盖现有的文件,并且在这种情况下它返回非零状态。以上Linux中的命令例子通过包含一个独立的test步骤来保证这一点。在Linux平台上,cp具有诸如-n、-i的选项,可更简洁地完成测试,但是在没有验证返回的退出状态正确之前不能依赖它们。

在进行归档设置时,请考虑归档命令不停失败的情况:有些情况要求操作者的干涉,有些是归档空间不够了。例如,如果往磁带机上写,但没有自动换带机,那么就有可能发生这种情况;如果磁带满了,除非换磁带,否则归档无法成功。应该确保任何错误情况或者任喊拿庞蜗菲教ㄗ⒉嵬惊求操作员干涉的情况都会被正确报告,这样才能迅速解决这些问题。否则ux_wal/目录会不停地被WAL段文件填充,直到问题解决(如果包含ux_wal/的文件系统被填满,UXDB将会关闭服务器。不会有未提交事务被丢失,但是数据库将会保持离线直到释放一部分空间)。

归档命令的速度并不强制要求,只要不低于服务器生成WAL数据的平均速度即可。即使归档进程稍微落后,正常的操作也会继续进行。如果归档进程慢很多,就会增加灾难发生时丢失的数据量。这同时也意味着ux_wal/目录包含大量未归档的段文件,并且可能最后超出了可用磁盘空间。建议监控归档进程,确保归档过程按照期望运转。

被归档的文件名最长为64个字符并且可以包含 ASCII 字母、数字以及标点符号的劝拿庞蜗菲教ㄗ⒉嵬锯组合。不需要保持原始的相对路径(%p),但是有必要保持文件名(%f)。

注意

请注意尽管WAL归档允许恢复任何对UXDB数据库中数据所做的修改,但它不会恢复对配置文件的修改(即uxsinodb.conf、ux_hba.conf和ux_ident.conf),因为这些文件都是手动编辑的,而不是通过SQL操作来编辑的。所以需要把配置文件放在一个日常文件系统备份过程可处理的位置。

归档命令只会被完成的WAL段调用。因此如果服务器产生了一点点WAL流量(或者在产生时有宽松的周期),从一个事务完成到它被安全地记录在归档存储中之间将会有较长的延迟。要为未归档数据设置一个时间限制,设置archive_timeout来强制要求服务器按照其设定的频度切换到一个新的WAL段。注意由于强制切换而被归档的文件还是具有和完全归档的文件相同的长度。因此设置一个很短的archive_timeout是很不明智的—将会占用归档存储空间。将archive_timeout设置为1分钟左右通常是合理的。

同样,如果希望确保一个刚刚完成的事务能被尽快归档,可以使用ux_switch_xlog进行一次手动段切换。其他与WAL管理相关的使用函数如下表所示:

表?4.1.?备份控制函数

名称返回类型描述
ux_create_restore_point(name text)ux_lsn为执行恢复创建一个命名点(只限于超级用户)。
ux_current_wal_flush_lsn()ux_lsn得到当前的预写式日志刷写位置。
ux_current_wal_insert_lsn()ux_lsn获得当前预写式日志插入位置。
ux_current_wal_lsn()ux_lsn获得当前预写式日志写入位置。
ux_start_backup(label text [, fast boolean [, exclusive boolean ]])ux_lsn准备执行在线备份(只限于超级用户或者复制角色)。
ux_stop_backup()ux_lsn完成执行排他的在线备份(默认只限于超级用户或者复制角色, 但是可以授予其他用户 EXECUTE 特权来执行该函数)。
ux_stop_backup(exclusive boolean [, wait_for_archive boolean ])setof record结束执行排他或者非排他的在线备份 (默认只限于超级用户, 但是可以授予其他用户 EXECUTE 特权来执行该函数)。
ux_is_in_backup()bool如果一个在线排他备份仍在进行中则为真。
ux_backup_start_time()timestamp with time zone获得一个进行中的在线排他备份的开始时间。
ux_switch_wal()ux_lsn强制切换到一个新的预写式日志文件(只限于超级用户)。
ux_walfile_name(lsn ux_lsn)text转换预写式日志位置为文件名。
ux_walfile_name_offset(lsn ux_lsn)text, integer转换预写式日志位置为文件名以及文件内的十进制字节偏移。
ux_wal_lsn_diff(lsn ux_lsn, lsn ux_lsn)numeric计算两个预写式日志位置间的差别。

当wal_level为minimal时,一些SQL命令被优化为避免记录WAL日志。在这些语句的其中之一的执行过程中如果打开了归档或流复制,WAL中将不会包含足够的信息用于归档恢复(崩溃恢复不受影响)。出于这个原因,wal_level只能在服务器启动时修改。但是,archive_command可以通过重载配置文件来修改。如果你希望暂时停止归档,一种方式是将archive_command设置为空串('')。这将导致WAL文件积累在ux_wal/中,直到一个可用的archive_command被重新建立。

XML 地图 | Sitemap 地图