对系统的任何配置更改和升级通常需要进行在测试环境中全面的测试和验证,然后在生产环境中实施这些更改。在移到生产系统之前为了保证安全,数据库管理员(DBA) 需要让测试系统承受与生产环境中的工作量很近似的工作量。另外,为了重现存在问题,需要重现当时场景,此时则需要用到数据库重演技术。
数据库重演(Database Replay)是 DM 中用来重现、定位和分析问题的一个重要手段,其基本原理是在数据库系统上捕获所有负载(记录外部客户端对服务器的请求),保存到二进制捕获文件,然后通过 DM 提供的数据库重演工具将捕获文件中的请求发送给捕获前由原始数据库备份恢复而来的重演测试系统上,从而帮助重现当时的场景。
用户可以调用系统过程 sp_start_capture 来启动捕获发往数据库的所有负载,并将该阶段收到的所有请求保存到二进制捕获文件中,然后使用 DM 提供的数据库重演客户端工具重放二进制捕获文件,再现当时真实环境的负载及运行情况,帮助进行问题跟踪和诊断。
使用系统过程 sp_stop_capture 可以停止捕获。调用系统存储过程SP_START_CAPTURE 和 SP_STOP_CAPTURE,可以获得数据重演文件。重演文件用于数据重演,存储了从抓取开始到抓取结束时,DM 数据库与客户端的通信消息。使用数据重演文件,可以多次重复抓取这段时间内的数据库操作,为系统调试和性能调优提供了另一种分析手段。
本文通过一个较为简单了操作将重演功能进行演示。
创建一个简单测试表:
create table replay_test (id number,name varchar(16));
executed successfully
used time: 61.481(ms). Execute id is 7.
开启数据库重演:指定生成重演文件路径和重演时间,-1代表重演由用户手动停止。
call sp_start_capture('/dm8/replay-test.cpt',-1);
DMSQL executed successfully
used time: 37.347(ms). Execute id is 5.
此时,做一些简单的操作,重演进程则会将这些操作完整记录到指定文件中去。
SQL> insert into replay_test values (100,'test1');
affect rows 1
used time: 6.936(ms). Execute id is 37.
insert into replay_test values (200,'test2');
affect rows 1
used time: 0.327(ms). Execute id is 38.
insert into replay_test values (300,'test3');
affect rows 1
used time: 0.343(ms). Execute id is 39.
insert into replay_test values (400,'test4');
affect rows 1
used time: 0.281(ms). Execute id is 40.
insert into replay_test values (500,'test5');
affect rows 1
used time: 0.276(ms). Execute id is 41.
SQL> commit;
executed successfully
used time: 1.335(ms). Execute id is 42.
检查插入的数据:
SQL> select * from replay_test;
LINEID ID NAME
---------- --- -----
1 100 test1
2 200 test2
3 300 test3
4 400 test4
5 500 test5
used time: 1.261(ms). Execute id is 43.
commit;
手动停止数据库重演工作。
SQL> call sp_stop_capture();
DMSQL executed successfully
used time: 104.839(ms). Execute id is 44.
利用达梦提供的dreplay工具来重演数据(命令如下)
该工具帮助信息如下,主要参数是SERVER和FILE这两个分别用来指定主机IP和端口及文件路径。
[root@localhost bin]# ./dreplay help
dreplay V8
Format: ./dreplay KEYWORD=value
Example: ./dreplay SERVER=LOCALHOST:5236 FILE=./test.cpt
Necessary Arguments: FILE
Keyword Explanation(Default)
--------------------------------------------------------------------------------
SERVER server address. Format: SERVER:PORT(LOCALHOST:5236)
FILE capture file path.
HELP show this usage help.
利用dreplay 工具对数据库进行重演操作:
[root@localhost bin]# ./dreplay server=localhost:5236 file=/dm8/replay-test.cpt
dreplay V8
1 of 12 operation start...
1 of 12 operation succeed...
2 of 12 operation start...
2 of 12 operation succeed...
3 of 12 operation start...
3 of 12 operation succeed...
4 of 12 operation start...
4 of 12 operation succeed...
5 of 12 operation start...
5 of 12 operation succeed...
6 of 12 operation start...
6 of 12 operation succeed...
7 of 12 operation start...
7 of 12 operation succeed...
8 of 12 operation start...
8 of 12 operation succeed...
9 of 12 operation start...
9 of 12 operation succeed...
10 of 12 operation start...
10 of 12 operation succeed...
11 of 12 operation start...
11 of 12 operation succeed...
12 of 12 operation start...
12 of 12 operation succeed...
replay successfully
查看操作是否生效,可以看到表中数据又重新执行了数据插入操作。
SQL> select * from replay_test;
LINEID ID NAME
---------- --- -----
1 100 test1
2 200 test2
3 300 test3
4 400 test4
5 500 test5
6 100 test1
7 200 test2
8 300 test3
9 400 test4
10 500 test5
10 rows got
used time: 0.174(ms). Execute id is 58.
通过上面的例子可以看到,达梦数据库重演操作还是比较易操作的,使用起来也比较方便。对于DBA诊断、重现故障、以及变更前测试都很有帮助,可以有效地提高工作效率。