目录
sys_receivewal — 从KingbaseES服务器上以流的方式得到预写式日志
sys_receivewal是用来从一个正在运行的KingbaseES集群以流的方式得到WAL日志,通过使用流复制协议接收WAL日志,将其写入到本地WAL文件,并存放于指定目录下。在做时间点恢复(PITR)时,这个目录作为归档位置使用。
当KingbaseES服务器上产生WAL日志时,sys_receivewal以流的方式实时接收WAL日志,不需要像 archive_command 那样等待段完成。因此,在使用sys_receivewal时不必设置 archive_timeout 。
sys_receivewal与 KingbaseES 后备服务器上的 WAL 接收进程不同,默认情况下,仅在关闭WAL文件时才会将缓存中的WAL数据刷新到WAL文件中。如果需要将缓存中的WAL数据实时刷新到WAL文件中,就必须指定选项 --synchronous
。 由于sys_receivewal不会重做接收的WAL,当 synchronous_commit 设置为 remote_apply
时,不能设置它为同步备用,否则它将作为一个永远无法达到同步状态的备用服务器,主服务器为了等待它达到同步状态而阻塞所有事务提交。为了避免出现这种情况,在有sys_receivewal的场景下尽量不要将 synchronous_commit
设置为 remote_apply
,如果必须要设置为 remote_apply
,那么应该将 synchronous_standby_names 配置为一个不包含sys_receivewal对应 application_name
的值。
建立流复制连接的用户必须是超级用户或者是具有 REPLICATION
权限(见 角色属性 )的用户,并且 sys_hba.conf
必须设置为允许以流复制的方式连接KingbaseES服务器,同时服务器也必须配置足够大的 max_wal_senders ,以便于保证至少提供一个可用的会话供流复制传输时使用。
如果该连接断开,或者它一开始就由于非致命错误而没有建立连接,sys_receivewal会不断尝试重新建立流复制连接,直到建立成功或人为中断。如果不希望无限重试下去,则可以使用 -n
参数来指定重试次数,一旦达到指定次数仍然没有重连成功就会自动退出。 在没有出现致命错误的情况下,sys_receivewal会一直运行,如果有WAL数据则会接收,没有则一直等待。可以使用SIGINT信号(Control+C)终止它。
sys_receivewal
[ option
...]
-D directory
--directory=directory
本地目录,接收WAL数据后生成的WAL文件会保存在该目录下。
该参数为必选参数。
-E lsn
--endpos=lsn
当接收到的WAL的LSN大于此参数指定的LSN后,会停止接收,并且以正常退出状态0退出。
如果当前接收的WAL记录的LSN和指定的 ``lsn`` 完全相等,会正常处理并继续接收,直到接收的WAL的LSN大于指定值。
--if-not-exists
当指定
--create-slot
并且具有指定名称的槽已经存在的情况下不要抛出错误。
-n
--no-loop
出现连接错误后立刻退出。如果不指定此参数,连接错误后会不断尝试重连。
--no-sync
这个选项可以使
sys_receivewal
不强制将WAL数据刷回磁盘。这样会更快,但是一旦此程序或者操作系统崩溃,WAL文件会丢失没有刷回磁盘的WAL数据,最严重时会导致WAL文件损坏。通常情况下,这个选项对于测试时有用,但是在对生产部署进行WAL归档时不应该使用。这个选项与
--synchronous
不兼容。
-s interval
--status-interval=interval
该选项指定发送回服务器状态包之间的间隔秒数,这样可以让我们更方便地监控服务器的进度。 当设定值为0时,则完全禁用定期状态更新。为了避免发生超时断开连接的情况,当服务器请求时,仍然会发送更新。 默认值为 10 秒。
-S slotname
--slot=slotname
要求sys_receivewal使用现有的复制槽。 当使用这个选项时,sys_receivewal向服务器上报刷新位置,显示每段是何时同步到磁盘的,当服务器不需要该段时,可以移除它。
当sys_receivewal的复制客户端在服务器上配置为同步后备时,则使用复制槽将会向服务器上报刷新位置,但只有在关闭 WAL 文件时才会上报。 因此,该配置将导致主服务器上的事务等待时间过长,并且实际效果也无法令人满意。 为了避免这种情况,还必须指定选项
--synchronous
(见下文)。
--synchronous
在收到 WAL 数据后立刻刷入磁盘,同时在刷新后立即将状态包发送回服务器(不考虑
--status-interval
)。如果sys_receivewal的复制客户端在服务器上配置为同步后备,则应该指定该选项,以确保能及时向服务器发送响应。
-v
--verbose
开启详细输出模式。
-Z level
--compress=level
启用WAL日志上的gzip压缩,并且指定压缩级别(共分为0到9个等级,0是不压缩而9是最大压缩)。所有的文件名后面都将自动添加后缀
.gz
。
下列命令行选项指定数据库连接参数。
-d connstr
--dbname=connstr
以连接字符串的方式来指定用于连接到服务器的参数。
为了和其他客户端应用程序保持一致,该选项又被称为
--dbname
。但是由于sys_receivewal并没有连接到集群中任何特定的数据库,因此将忽略掉连接字符串中的数据库名称。
-h host
--host=host
指定运行服务器的主机名。如果该值以斜线开始,则用作 Unix 域套接字的目录。默认值取自
KINGBASE_HOST
环境变量的值(前提条件是已设置该环境变量),否则通过重试 Unix 域套接字连接来获得。
-p port
--port=port
指定服务器正在监听连接的 TCP 端口或者本地 Unix 域套接字文件扩展名。默认值取自
KINGBASE_PORT
环境变量中(前提条件是已设置该环境变量),否则使用在程序中编译的默认值。
-U username
--username=username
指定哪个用户连接。
-w
--no-password
不需要密码认证。如果服务器要求密码认证,而密码无法通过其他方式获得(例如
.kbpass
文件),那么连接将会失败。 这个选项一般用于无法交互(输入密码)的批处理任务或脚本。
-W
--password
在连接到数据库之前,强制sys_receivewal提示输入密码。
这个选项不是必选的。当服务器要求密码认证时,sys_receivewal将自动提示输入密码。如果服务器需要密码认证,sys_receivewal会先尝试连接,连接失败后再提示需要输入密码,用户输入密码后再次尝试连接。这种情况下,使用
-W
参数,sys_receivewal会直接提示输入密码,不会连接失败后再提示。
为了指定物理复制槽,sys_receivewal 可以执行下列两种操作中的其中一种:
--create-slot
使用
--slot
中指定的名称创建新的物理复制槽,然后退出。
--drop-slot
删除
--slot
中指定名称的复制槽,然后退出。
其他选项也可用:
-V
--version
打印sys_receivewal的版本信息,然后退出。
-?
--help
显示关于sys_receivewal命令行参数的帮助信息,然后退出。
和大多数其他KingbaseES工具一样,这个工具也使用libkci支持的环境变量。
环境变量 SYS_COLOR
指定是否在诊断消息中使用颜色。 取值范围有 always
, auto
, never
。
无
从服务器 mydbserver
上流式接收WAL日志,并且将它存储在本地目录 /opt/Kingbase/ES/V8/archive
:
$ sys_receivewal -h mydbserver -D /opt/Kingbase/ES/V8/archive
从服务器 mydbserver
上流式接收WAL日志,并且将它存储在本地目录 /opt/Kingbase/ES/V8/archive
,当出现错误时,不再循环重试,而是立刻退出 :
$ sys_receivewal -h mydbserver -D /opt/Kingbase/ES/V8/archive -n
从服务器 mydbserver
上流式接收WAL日志,并且将它存储在本地目录 /opt/Kingbase/ES/V8/archive
,用户名为test,端口号为54321,密码为123456,并且将接收到的日志进行压缩处理,压缩级别为6 :
$ sys_receivewal -h mydbserver -D /opt/Kingbase/ES/V8/archive -U test -p 54321 -W 123456 -Z 6
从服务器 mydbserver
上流式接收WAL日志,并且将它存储在本地目录 /opt/Kingbase/ES/V8/archive
,指定复制槽为test,并以这个名称创建新的物理复制槽,该槽已经存在时不要抛出错误 :
$ sys_receivewal -h mydbserver -D /opt/Kingbase/ES/V8/archive -S test --create-slot --if-not-exists
从服务器 mydbserver
上流式接收WAL日志,并且将它存储在本地目录 /opt/Kingbase/ES/V8/archive
,指定复制槽为test,并且在收到 WAL 数据后立即刷入磁盘,同时在刷新后立即将状态返回给服务器 :
$ sys_receivewal -h mydbserver -D /opt/Kingbase/ES/V8/archive -S test --synchronous
当使用sys_receivewal而不是 archive_command 作为主要的 WAL 备份方式时,强烈建议使用复制槽,否则在没有任何信息(不管是来自 archive_command 还是来自复制槽)能够显示 WAL 流已经归档到什么程度的情况下,服务器在备份好WAL日志文件之前就已经重用或者移除它们。不过需要注意的是,如果接收方没有及时获取 WAL 数据,则复制槽将会填满服务器的整个磁盘空间。
如果在源集群上启用了组权限,sys_receivewal将会在接收到的WAL文件上保留组权限。
在SIGINT信号终止sys_receivewal时,退出状态将以正常状态0退出(由于这是以正常的方式结束的,因此这不是一种错误)。 而对于致命错误或者其他信号,退出状态将为非0。