在实际应用中,如果数据库规模很大,并且对数据的实时性要求不是很严格,则可以配 置多个异步备库用于分担统计报表等任务,减少主库压力。
达梦8的异步备库是被主库“驱动”的,没有特殊的参数配置。只需要有一份包含所有节点的dmmal.ini文件。dmwatcher.ini文件中DW_TYPE=LOCAL,DW_MODE = MANUAL。
主库则首先需要在dm.ini文件中设置TIMER_INI=1,然后在dmarch.ini文件中添加异步归档路径和参数,最后在dmtimer.ini文件中定义日志发送策略。当然也需要有一份包含所有节点的dmmal.ini文件。
作为初学者有两个参数比较重要,ARCH_SEND_DELAY和FREQ_MINUTE_INTERVAL。前者在dmarch.ini文件,后者在dmtimer.ini文件。
下面做一个实验来验证这两个参数工作原理:
ARCH_SEND_DELAY=10
FREQ_MINUTE_INTERVAL=1
主库循环向临时表中加入数据
#创建测试表,用于记录时间
create table timer_t1(d date);
#循环插入时间数据
declare
begin
for i in 1..10000 loop
insert into timer_t1 values(sysdate);
commit;
sleep(1);
end loop;
end;
/
备库编写一个shell脚本1.sh用于检测准备的同步情况
async_instance()
{
disql -s / as sysdba <<EOF
set lineshow off
select to_char(max(d),'hh24:mi:ss'),max(clsn),max(cur_lsn)
from v\$arch_file,v\$rlog,timer_t1;
EOF
}
primary_instance()
{
disql -s SYSDBA/SYSDBA@192.168.100.100:5236 <<EOF
set lineshow off
select max(cur_lsn),to_char(max(d),'hh24:mi:ss')
from v\$rlog,timer_t1;
EOF
}
echo "主库lsn" "主库时间" "备库时间" "备库归档lsn" "备库redo lsn" | awk '{printf("%-10s %-10s %-10s %-10s %-10s\n",$1,$2,$3,$4,$5)}'
while :
do
echo `primary_instance | grep [0-9]:[0-9] ` `async_instance | grep [0-9]:[0-9]`
sleep 10
done | awk '{printf("%-15s %-15s %-15s %-15s %-15s\n",$1,$2,$3,$4,$5)}'
执行shell脚本进行监控如下:
由上图可见:
主库的时间和lsn循序递增,备库的归档日志和redo日志的lsn永远保持一致。备库的数据和lsn每1分钟刷新一次。lsn永远落后于主库。数据在每次刷新触发时落后主库10分钟(ARCH_SEND_DELAY),下次刷新前落后主库11分钟(ARCH_SEND_DELAY + FREQ_MINUTE_INTERVAL )
测试结论:
主库根据FREQ_MINUTE_INTERVAL的定义的频率发送日志到异步备库,每次发送ARCH_SEND_DELAY之前的日志。
下面是本次测试环境的配置文件内容
主库
dmtimer.ini:
[RT_TIMER]
TYPE = 2
FREQ_MONTH_WEEK_INTERVAL = 1
FREQ_SUB_INTERVAL = 0
FREQ_MINUTE_INTERVAL = 1
START_TIME = 00:00:00
END_TIME = 00:00:00
DURING_START_DATE = 2016-02-11 17:36:09
DURING_END_DATE = 9999-12-31 23:59:59
NO_END_DATE_FLAG = 1
DESCRIBE = RT_TIMER
IS_VALID = 1
dmarch.ini文件:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = TEST2
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /u01/dm/dmarch/test
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
[ARCHIVE_ASYNC]
ARCH_TYPE = ASYNC
ARCH_DEST = TEST3
ARCH_TIMER_NAME = RT_TIMER
ARCH_SEND_DELAY =10
dmmal.ini文件:
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = TEST1
MAL_HOST = 192.168.100.100
MAL_PORT = 5800
MAL_INST_HOST = 192.168.100.100
MAL_INST_PORT = 5236
MAL_DW_PORT = 6000
MAL_INST_DW_PORT = 5900
[MAL_INST2]
MAL_INST_NAME = TEST2
MAL_HOST = 192.168.100.101
MAL_PORT = 5800
MAL_INST_HOST = 192.168.100.101
MAL_INST_PORT = 5236
MAL_DW_PORT = 6000
MAL_INST_DW_PORT = 5900
[MAL_INST3]
MAL_INST_NAME = TEST3
MAL_HOST = 192.168.100.102
MAL_PORT = 5800
MAL_INST_HOST = 192.168.100.102
MAL_INST_PORT = 5236
MAL_DW_PORT = 6000
MAL_INST_DW_PORT = 5900
dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 12345
INST_INI = /u01/dm/dmdata/test/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = '/u01/dm/dmdbms/bin/DmServiceTEST1 restart'
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
备库
dmwatcher.ini:
[GRP1]
DW_TYPE = LOCAL #本地守护类型
DW_MODE = MANUAL #故障手动切换模式
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 12345
INST_INI = /u01/dm/dmdata/test/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = '/u01/dm/dmdbms/bin/DmServiceTEST3 restart'
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
dmarch.ini:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /u01/dm/dmarch/test
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
dmmal.ini文件与主库保持一致