一、简介
sys_xlogical读取Kingbase的Redo日志并将Redo日志的记录重新构造成SQL语句,最终在另一个Kingbase实例中重新执行这些语句,达到复制的目的。
sys_xlogical 与 Kingbase 类似,要求有一个工作目录,可以用 -D 指定,默认是创建在当前目录下, sys_xlogical 启动时会去工作目录下读取 xlogical.conf 配置文件,同时 sys_xlogical 将会利用这个工作目录存储 Pid文件,Control 控制文件,大对象解析时可能用到的临时文件,zombiexact僵死事务文件。xlogical.conf 的配置语法同Kingbase 的配置语法相同。
sys_xlogical工作方式类似于UNIX系统的管道,每个实例需要配置源端Source和目的端Destination,数据从源端进入经过处理到达目的端,通过配置不同的源端和目的端,新的逻辑复制工具目前可以支持:
1. Kingbase数据库到文件
2. Kingbase数据库到Kingbase数据库
3. Kingbase数据库到oracle,DB2,Mysql等异构数据库
4. Kingbase数据库到redo记录展示表
5. 从一个sys_xlogical实例到另一个sys_xlogical实例
6. sys_xlogical多实例配合进行级联复制
7. kingbase数据库之间的双向复制
二、sys_xlogical配置参考
debug_assertions (布尔)
#调试选项,打开Assert,当编译选项,-enable-cassert打开时,默认为on,否则为off。
destination(字符串)
设置复制的目的可以使用 4 种,默认为 file:
- file, 如:'file:record_type=deparsed location=test.sql',record_type 可以是 decoded、deparsed(默认)或 text,location 的默认为标准输出。
- kingbase,如:'kingbase:dbname=TEST user=SYSTEM port=54321 password=MANAGER options=\'-c enable_trigger=off\'',即为基于 keyword 的 kingbase 连接字符串。如果密码需要使用加密形式,可以使用sys_xlogical的-e选项生成加密密码,然后将password关键字换为encode_password即可。如:MANAGER的加密形式是nK1jIL1HNKxZr21xMh@=,即将password=MANAGER换为encode_password=nK1jIL1HNKxZr21xMh@=。
- odbc, 如:'odbc: Dsn=kingbase',使用odbc数据源做为同构/异构数据库的连接参数。
- mirror,如:'mirror:host=localhost port=8437 record_type=deparsed connect_timeout=10',目前仅支持如上参数,deparsed 是目前仅支持的record 类型,也是默认值。
- 空, 表示使用被动模式,监听在选项 listen_addresses 、port 设置的地址和端口等待另一个实例来连接。
mirror方式分又两种模式(mode):
Push 模式,就是上面配的国电的工作方式,设置目的端 sys_xlogical 的 source 选项为空,源端主动连接目的端,将数据“推”过来
Pull 模式,是将源端的 destination 设置成空,目的端主动连接源端,发请求来“拉”数据
注:Push 模式是专为国电的网络隔离设备两边的数据同步而开发的网络通信受限的 mirror 复制模式,对于一般的应用应该使用 Pull 模式。无论哪种模式,在连接建立时,目的端 sys_xlogical 会发送上次传输的日志位置给源端,源端从该位置开始解析。
source (字符串)
设置复制的源,设置格式及说明参照destination,只是file类型的location的默认值为标准输入。而且 record_type仅支持deparsed
discard_change_before_commit (布尔)
Redo 日志解析时,该选项打开,在遇Commit记录之前就根据inclusive_list和exclusive_list配置的过滤规则,丢弃不需要的数据。如果该选项关闭会在遇到Commit记录之后才应用过滤规则。
该选项打开如果同步的表只是数据库中表的一小部分,在对Redo日志解析时可以节省大量内存和性能提升。
enable_ddl (布尔)
支持DDL语句的提取,如create table、create index 等。默认为 on
enable_dml (布尔)
支持DML语句的提取INSERT、UPDATE、DELETE的提取。默认为 on
enable_sequence(布尔)
支持序列语句的提取,如nextval、setval的提取。默认 on
enable_largeobject(布尔)
支持大对象的提取。默认为 off
enable_mirror_client_keepalives (布尔)
mirror模式下,主动连接的一端也打开TCP的keepalives特性(listen的一端是必开启的),可通过选项tcp_keeplives_count、tcp_keepalives_idle、tcp_keepalives_interval来调整keepalives。默认为on
enable_position_notify(布尔)
mirror模式默认情况下,只有有事务发送到目的端,目的端的sys_xlogical才会记录下当前的日志位置,当目的端 sys_xlogical重启时将把该位置发送给源端,源端再从这个位置开始解析和发送数据。如果在Redo日志中由于多个database或者过滤选项导致发送到目的端的事务相对于Redo日志中的事务很少,那么就会发生源端解析很多的日志才会更新目的源的记录位置,一旦发生重启,源端从很前面的日志位置重新解析,本选项可以让源端遇到一下事务结束,不管是不是目的端要的事务都发送当前的日志位置给目的端,本选项会导致mirror方式下网络流量增加。默认为off
exclusive_list(字符串)
以’;’分隔的不解析的关系列表,配置语法为正则表达式,如:’myschema[.].*;public[.]table’,不解析myschema模式下的所有表和public模式下的table1表,由于'.' 在正则表达式表示任意字符,所以如果要有真正的'.' 必须用'[]' 来转义。默认为空
inclusive_list(字符串)
以’;’分隔的解析的关系列表,配置语法为正则表达式,同exclusive_list,默认为空表示没有定义inclusive 规则,所有表都将解析。
tcp_ keepalives_count(整数)
设置转接空闲时发送的keepalives包的个数,参见Kingbase手册中的tcp_keepalives_count参数。默认值0表示使用操作系统默认值
tcp_keepalives_idle(整数)
设置在一个连接上空闲多少秒,将发送一个keepalives包,参见Kingbase手册中的tcp_keepalives_idle参数,默认值0表示使用操作系统默认值。Linux上一般为2个小时
tcp_keepalives_interval (整数)
设置发送两个keepalives 包的时间间隔,参见Kingbase手册中tcp_keepalives_interval参数。默认值0表示使用操作系统默认值
listen_addresses(字符串)
设置mirror的模式下,监听的网络地址。默认值为’*’,表示监听所有地址
log_file(字符串)
设置日志文件的文件名。默认为位于工作目录下的xlogical.log文件
log_line_prefix (字符串)
设置每条日志的前缀,可以使用’%t ’或‘%m ’(到毫秒)为日志加上时间戳。默认为空
log_min_messages (枚举)
设置日志级别,按日志量从少到多的顺序,可设值为,FATAL,ERROR,WARNING ,NITICE,LOG,DEBUG1,DEBUG2,DEBUG3,DEBUG4,DEBUG5。默认为LOG
log_statement(布尔)
在数据库的destination中,设置是否log所有的SQL语句,本项仅用于调试。默认为off
mapping_list(字符串)
设置表名的重写规则表,使用正则表达式语法,以’;’分隔,可以在解析之后把对一个表的操作变成对另一个表的操作,如’public[.](.*)->myschema.\\1’,表示将public模式下的所有表改写到myschema下。默认为空
max_mem_per_largeobject(整数)
设置大对象解析时单个对象最大可以使用的内存,当大对象大于这个值时,将启用临时文件作为缓存,临时文件位于工作目录下的lotmp子目录下。默认值为32MB
port (整数)
被动模式下,设置监听端口
reassemble_single_threshold(浮点数)
事务重组模块会把当前所有正在进行的事务所产生的数据都放在内存的Hash表中,在事务过大时,会启用效率低的单事务模式对Redo日志文件进行多遍扫描,这里设置的是当前使用内存占 reassemble_work_mem 多少时启用单事务模式。默认为0.8
reassemble_work_mem (整数)
事务重组模块会把当前所有正在进行的事务所产生的数据都放在内存的Hash表中,这里配置的是这些事务最大可使用的内存。默认值为32MB
support_largeobject_forward_reference(布尔)
支持大对象向前引用,在 OCI 中,经常在引用大对象的地方生成一个空的大对象(使用接口EMPTY_BLOB()),再在后面写入大对象数据。默认为off
use_llog_parse_bind(布尔)
使用 LLOG 的Redo日志类型中记录的PBE语句,为了提高效率kingbase在处理PBE时直接LOGPBE语句,在解析这种日志时可直接使用,设置off时将弃用PBE语句,转用普通的逻辑sql方式。默认为on
column_with_double_quotes(布尔)
将sql语句中的列字段加上双引号。若列名为关键字时(如:from),数据库无法识别此列。默认为off
batch_cache_mem(整数)
数据缓存区,标准的insert/PBE语句绑定会将同一个事务中一个表的连续数据转换成多组的形式以提升性能,当缓存区满时对数据进行冲刷,设置0关闭缓存功能。默认值为256KB
use_pbe_parse_heap(布尔)
使用PBE批量绑定的方式,代替标准sql语句的形式,以提升性能。当存在同一个事务中一个表的连续数据时,这些连续数据将被批量绑定成一组数据,以减小目标数据库解析时间,若不存在连续数据,那么此选项会加重数据库的处理负荷,而影响同步性能。默认off
compatible_odbc(布尔)
当同步工具的最终destination为odbc模式且需要同步大对象数据时,需打开odbc兼容模式。默认off
support_logmnr_contents(布尔)
redo日志记录展示表,同步工具将redo日志变化的内容记录到public.logmnr_contents表中。默认off
largeobject_cite_withoid(布尔)
将大对象的oid信息,展示到解析后的sql语句中。默认off
largeobject_format_string(布尔)
大对象数据默认采用特定接口的方式进行处理,数据内容不可见。此选项会将大对象数据转换成标准的sql语句。默认off
track_sql_execution_threshold(时间)
如果是destination配置的数据库,那么通常的瓶颈应该是数据库的SQL语句执行,这里可以设置一个阈值来追踪执行慢的SQL语句,本参数接受一个时间间隔,可以使用单位ms、s、min、h,默认单位为毫秒,当一个SQL语句的执行时间大于这个时间间隔时,逻辑复制程序会向日志中输出WARNING信息,设置0ms关闭该功能。默认0ms
treat_as_zombie_xlog_threshold(整数)
如果一个长事务跨了很多的日志文件,当解析一部分日志文件后,xlogical程序重启,那么程序将回到该事务开始的日志文件重新进行扫描,之后所有已经解析的日志都将再处理一遍,导致事务中断解析的时间很长。通过设置这个参数,将一个事务跨过指定的日志文件数视为僵死事务,系统会将这些僵死事务信息存贮到磁盘,xlogical程序重启后直接从磁盘上读取这些事务的信息而不用回到僵死事务的开始。从而减少事务的中断解析时间
discard_hide_for_xlogical_change(布尔)
忽略一种被特殊标识对同步工具隐藏不可见的redo日志。例如:双向复制过程中,同步工具在目的端数据库产生的redo日志会增加该隐藏标识,忽略这些数据以防该数据被重新同步至原数据库。默认off。
discard_hide_for_xlogical_sequence (布尔)
忽略一种被特殊标识对同步工具隐藏不可见的redo日志中的sequence,用于同步工具双向复制,默认值为on。
discard_trigger_tuple(布尔)
在redo日志中,对trigger所产生的数据进行了标识。当参数为on时,同步工具不把trigger所产生的数据同步到目的端;如果需要把触发器产生的数据同步到目的端,则把参数设为off。默认on
condition_clause_force_index(布尔)
默认状态下同步工具只支持有主键表的update/delete操作,当需要支持无主键的update/delete操作时需要关闭该参数,同步工具将依据redo日志的类型自动处理。默认on
replace_ddl_header(枚举)
部分异构数据库的语法规则不一致,DDL语句带有设置用户名和路径的内容。需要进行改写或删除等操作。
default 保持不变
delete 删除用户名和路径内容
replace:xxx 将用户名和路径内容使用xxx进行替换
默认default
odbc_deallocate(布尔)
当配置odbc模式时控制是否执行deallocate语句,部分异构数据库不支持该语法。默认on
heap_to_primarykey(布尔)
当llogminer_condition_method设置成heap时,同步工具将使用表中所有的列作为更新/删除操作的子句。若此选项打开,有主键的表将使用主键列作为子句。该选项通常与inclusive_list配合使用进行条件筛选。
默认off
compatible_level(字符串)
同步工具兼容异构数据库参数,可选参数oracle、db2、mysql、dm、mssql。
请参考异构数据库同步文档的描述更为详细.
enable_insert(布尔)
同步工具控制是否同步insert语句,仅当enable_dml等于on时有效,默认为on。
enable_delete (布尔)
同步工具控制是否同步delete语句,仅当enable_dml等于on时有效,默认为on。
enable_update (布尔)
同步工具控制是否同步update语句,仅当enable_dml等于on时有效,默认为on。
enable_insert_into_select (布尔)
同步工具是否将insert into select 语句作为DDL语句解析,设置off时将采用DML方式逐条处理。默认为on。
object_with_double_quotes (布尔)
控制同步工具解析DML操作时数据库对象(模式名/表名)是否带双引号。其中compatible_level是MySQL异构数据库的时,该参数需要设置为off。默认值为on。
scp_remote_control (字符串)
同步工具配置在standby环境中时,将在两台主机上拥有双份控制文件,scp_remote_control 设置远程同步工具的控制文件所在路径,通过ssh免密方式拷贝远程同步工具的控制文件到本地同步工具的工作目录,通过比较选择lsn最大值的控制文件来设置同步起始位置。配置示例如下:scp='lzzhang@88.88.88.88:/tmp/xlogical/xlogical.control'。
build_destfile_interval (整数)
设置destination在file模式下产生新的同步数据文件的时间间隔,默认值为0,所有的同步数据写入一个文件。设置大于0,每隔build_destfile_interval秒生成一个目的文件,文件id号依次递增,循环等待生成文件。build_destfile_interval可配合logical_upload.sh和logical_download.sh脚本共同使用,来组建适合光闸设备的网络环境。
with_oids (布尔)
设置on当建表使用with oids时,解析insert语句时会同步oid的信息。默认off。
rewrite_ddl (字符串)
DDL语法转换模块,配置语法转换的外部命令。
关于inclusive_list参数的拓展配置
扩展配置:
拓展配置可以精确到字段并细化至DML增删改操作,可用如下字符配置。
行为符:
’!’不解析该字段,’^’新增字段,’i’插入操作,’u’更新操作,’d’删除操作。
动作符:
‘=’设置默认值,‘as’重设字段名,‘==’判断相等,‘!=’判断不等,‘|’或操作,‘&’与操作。
标识符:
‘@’标识字段名,‘--null’代表null,‘,’配置分隔符,’--null:’当该列是null时设置’:’号后的数据为默认值。
当未配置iud行为符时,默认增删改操作。
条件过滤仅支持全‘与’或全‘或’,不支持‘与’‘或’同时存在。
配置示例:
public[.]test(!@b, !i@c, !u@d, @e = "100" as "e1", @f as "f1", i@g as "g1", i@h = "101", u@j = "102", i@j as "j1", ^@k = "123", ^i@l = "111", ^u@m = "222"); public[.]test1(@b = "10", @b == "1" | @c != "--null")
!@b增删改不解析b字段,!i@c插入时不解析c字段,@e = "100" as "e1"增删改重设字段名并设默认值,i@h = "101"插入时设置默认值,^@k = "123"插入更新操作新增字段k并设置默认值,^i@l = "111"插入操作新增字段l并设默认值。@b == "1" | @c != "--null"同步b字段等于1或c字段不等于null的数据。
三、使用和部署
创建资源
①.首先准备KingbaseV7数据库,并且打开redolog归档以及enable_llogminer选项,然后启动数据库。
②.创建测试数据
创建sql文件test.sql,内容如下
drop table if exists tbl1;
create table tbl1(a int,b int,primary key(a));
insert into tbl1 values(1,1);
insert into tbl1 values(2,1);
insert into tbl1 values(3,1);
delete from tbl1 where a = 1;
update tbl1 set b = 3 where a = 3;
1.从Kingbase到文件
1.1 创建同步工具目录及xlogical.conf配置文件
mkdir xlog_source
touch xlog_source/xlogical.conf
xlogical.conf 文件内容如下
source='kingbase:user=SYSTEM dbname=TEST password=123456 port=54321 host=localhost'
destination='file: record_type=text location=out.sql'
1.2 启动sys_xlogical网闸
sys_xlogical -D xlog_source
1.3 KingbaseV7执行测试数据
isql -U SYSTEM -W 123456 -d TEST -p 54321 -f test.sql
1.4 查看输出文件xlog_source/out.sql