KReplay 技术介绍
KReplay 技术主要应用于多种数据库相关场景,包括数据库升级、操作系统升级、存储系统升级、数据迁移以及国产化环境替代等。通过从生产库捕获真实工作负载,并在测试库进行回放,以测试数据库系统的功能和性能。KReplay确保在回放过程中数据和真实线上数据的一致性,从而评估系统变更对生产系统的影响。这种技术对于验证数据库兼容性、保障系统稳定性和性能优化等方面具有重要作用。
流程图如下:

1、源端为 0racle 时,版本应为 10.2.0.4及以上版本。
2、源端为 0racle 时,开启工作负载捕获情况下,会产生5%的性能负载。
3、目标端进行工作负载重放前,需使用KDTS或KFS 进行数据迁移,保持两端数据一致。
4、如需在目标端进行多次重放测试,建议对数据进行备份;重放前进行数据恢复,以便于对比结果
实验过程
1、源端oracle数据准备
--1、创建用户KDTS_RAT,密码oracle,并授予相关权限。
sqlplus / as sysdba
CREATE USER KDTS_RAT IDENTIFIED BY oracle;
GRANT dba,connect TO KDTS_RAT;
GRANT advisor TO KDTS_RAT;
GRANT select any dictionary TO KDTS_RAT;
GRANT administer sql tuning set TO KDTS_RAT;
--2、清理部分测试数据。
TRUNCATE TABLE space01.space_layout_dtl;
TRUNCATE TABLE space01.space_seg_dtl;
--3、统计业务用户SPACE01对应的模式下测试对象及数据量、数据类型信息。
conn / as sysdba
exec DBMS_STATS.GATHER_SCHEMA_STATS('SPACE01');
col owner for a20
col table_name for a30
SELECT owner,table_name,num_rows,blocks
FROM dba_tab_statistics WHERE owner='SPACE01'
AND table_name IN('SPACE_LAYOUT_DTL', 'SPACE_SEG_DTL');
col data_type for a30
SELECT distinct owner,table_name,data_type
FROM dba_tab_columns WHERE owner='SPACE01'
AND table_name IN('SPACE_LAYOUT_DTL', 'SPACE_SEG_DTL')
ORDER BY 2;
2、目标端KES环境准备
--1、清理部分测试数据。
ksql -U system -d test
TRUNCATE TABLE space01.space_layout_dtl;
TRUNCATE TABLE space01.space_seg_dtl;
SELECT count(*) FROM space01.space_layout_dtl;
SELECT count(*) FROM space01.space_seg_dtl;
--3、将模式space01中的对象进行碎片整理、统计信息收集。
ksql -U system -d test
VACUUM space01.space_base;
VACUUM space01.space_header;
VACUUM space01.space_segment_detail;
VACUUM space01.space_codeshare;
VACUUM space01.space_segment;
ANALYZE space01.space_base;
ANALYZE space01.space_header;
ANALYZE space01.space_segment_detail;
ANALYZE space01.space_codeshare;
ANALYZE space01.space_segment;
--4、设置KWR相关参数,便于对重放时对KES的负载进行性能信息采集。
su - kingbase
vi /data/kingbase.conf
-------修改以下内容------
#add for kwr
track_sql = on
track_instance = on
track_wait_timing = on
track_counts = on
track_io_timing = on
track_functions = 'all'
sys_stat_statements.track = 'top'
sys_kwr.track_objects = on
sys_kwr.track_os = on
sys_kwr.enable = on
sys_kwr.topn = 20
sys_kwr.history_days = 8
sys_kwr.interval = 60
sys_kwr.language = 'chinese'
#add for ksh
track_activities = on
sys_stat_statements.max = 10000
sys_kwr.collect_ksh = on
sys_kwr.ringbuf_size = 200000
tail -21 /data/kingbase.conf
sys_ctl restart
ksql -U system -d test
CREATE EXTENSION sys_kwr;
SELECT * FROM perf.kwr_snapshots;
SELECT * FROM perf.create_snapshot();
SELECT * FROM perf.kwr_snapshots;
--二、设置免密连接数据库
cat /data/sys_hba.conf | grep -i trust
vi /data/sys_hba.conf
local all all trust
# IPv4 本地连接:
host all all 127.0.0.1/32 trust
host all all 0.0.0.0/0 trust
cat /data/sys_hba.conf | grep -i trust
--2、生效后并进行验证。
sys_ctl reload
ksql -Usystem -dtest
\q
ksql -Usystem -dtest -h127.0.0.1 -p54321
\q
ksql -Usystem -dtest -h192.168.40.111 -p54321
\q
--三、目标端用于性能监控的用户
--1、用管理员system连接数据库test。
--2、设置用户space01对数据库kingbase的操作权限。
ksql -U system -d test
ALTER USER space01 WITH superuser;
GRANT all ON database kingbase TO space01;
--3、设置用户space01对程序包dbms_output的操作权限。
GRANT all ON package dbms_output TO space01;
3、源端Oracle工作负载捕获
--一、建立捕获目录
--1、登录(或切换至)oracle用户,创建目录db_replay_capture,用于存放工作负载信息。
su - oracle
mkdir db_replay_capture
cd db_replay_capture/
pwd
--2、连接数据库管理员sys,创建目录对象db_replay_capture_dir。
sqlplus / as sysdba
CREATE OR REPLACE directory db_replay_capture_dir AS '/home/oracle/db_replay_capture';
--3、可将目录对象的读写权限授予用户KDTS_RAT。
GRANT read,write ON directory db_replay_capture_dir TO KDTS_RAT;
--4、检查数据库的定义信息。
set lines 222
col owner for a10
col directory_name for a25
col directory_path for a60
SELECT * FROM dba_directories;
col grantee for a10
col owner for a10
col table_name for a30
col grantor for a10
col privilege for a10
SELECT * FROM dba_tab_privs WHERE grantee='KDTS_RAT';
--二、捕获工作负载
--1、捕获工作前,自定义生成KWR开始快照。
sqlplus / as sysdba
SELECT dbms_workload_repository.create_snapshot() as begin_snapid FROM dual;
--2、连接数据库管理员sys,查看源端Oracle数据库的当前SCN信息。
SELECT systimestamp, current_scn from v$database;
--3、开启工作负载捕获操作。
BEGIN
DBMS_WORKLOAD_CAPTURE.start_capture (name=>'test_capture_1',
dir=>'DB_REPLAY_CAPTURE_DIR', duration=> NULL);
END;
/
--4、上传测试数据的脚本至/home/oracle中。
pwd
ls -l ora_*
--5、新建两个会话窗口,分别执行脚本,模拟数据库操作,以产生相应的工作负载。
nohup sqlplus space01/space01@192.168.40.40:1521/orcl @/home/oracle/ora_space_seg_dtl_V0.01.sql >> /home/oracle/info1.log 2>&1 &
nohup sqlplus space01/space01@192.168.40.40:1521/orcl @/home/oracle/ora_space_layout_dtl_V0.01.sql >> /home/oracle/info2.log 2>&1 &
--6、脚本执行完成后,停止工作负载捕获。
conn / as sysdba
BEGIN
DBMS_WORKLOAD_CAPTURE.finish_capture;
END;
/
--7、源端测试表数据信息统计。
SELECT count(*) FROM space01.space_layout_dtl;
SELECT count(*) FROM space01.space_seg_dtl;
--8、获取工作负载捕获操作的captureid,查询负载的起止时间时间(或SCN)。
SELECT DBMS_WORKLOAD_CAPTURE.get_capture_info('DB_REPLAY_CAPTURE_DIR') FROM dual;
set lines 222
col start_time for a35
col end_time for a35
SELECT start_scn,scn_to_timestamp(start_scn) start_time,
end_scn,scn_to_timestamp(end_scn) end_time
FROM dba_workload_captures WHERE id = 1;
--9、查看捕获到的工作负载生成的相关文件。
pwd
cd db_replay_capture/
ls -l
ls -l cap
ls -l capfiles
ls -l capfiles/inst1
ls -l capfiles/inst1/aa
--10、将工作负载生成的相关文件打包、下载。
cd ~
tar -cf db_replay_capture.tar db_replay_capture
ls -ld db_replay*
--11、连接数据库管理员sys,捕获工作负载后,自定义生成KWR开始快照。
sqlplus / as sysdba
SELECT dbms_workload_repository.create_snapshot() as end_snapid FROM dual;
--三、收集源端Oracle的AWR、ASH、ADDM报告
--1、根据负载对应的开始和结束快照id,生成对应的AWR报告。(如begin_snapid为3、end_snapid为6)
sqlplus / as sysdba
@/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/awrrpt.sql
@/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/ashrpt.sql
@/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/addmrpt.sql
4、工作负载文件格式转换
--一、转换工具参数配置
--1、将工作负载文件上传至/install中,并进行解压。
su - kingbase
cd /install
pwd
scp oracle@192.168.40.40:/home/oracle/db_replay_capture.tar /install
ls -ld db*
tar -xf db_replay_capture.tar
ls -ld db*
--2、创建目录db_replay_decode,设置属主和权限,用于存放解码后的文件。
pwd
mkdir db_replay_decode
ls -ld db_replay_decode
--3、配置conf目录中conf.properties参数。
pwd
cd /install/OracleDecode-20241114/
ls -l
ls -l conf/
vi ./conf/conf.properties
raw.value.char.nchar_charset = UTF-8
raw.value.char.char_charset = UTF-8
raw.cut.output.file.size = 1
raw.parser.source-file = /install/db_replay_capture
raw.parser.target-file = /install/db_replay_decode
raw.parser.name = parser
raw.parser.parallel-count = 8
raw.parser.output-file-xml = false
raw.parser.output-file-binary = true
raw.parser.index-storage = h2
raw.creat.default.login = false
raw.creat.default.logout = true
raw.record.default.transaction.command = false
raw.delete.decode.file = false
raw.parser.kdms-convert = false
cat ./conf/conf.properties |grep -v ^# |grep -v ^$
--二、获取转换后的工作负载文件
--1、执行start.sh开始解码。
pwd
ls -l
sh start.sh
--2、查看目录db_replay_decode中解码后生成的文件。
cd /install/db_replay_decode/
ls -lrt
5、目标端KES工作负载重放
--一、重放前的预处理准备(节点50)
--1、用管理员system连接数据库test。
--2、将目录db_replay_decode中解码后生成的文件,进行预处理操作。
--3、执行预处理统计信息显示函数。
sys_ctl start -D /install/KES/bin/data
ksql -U kingbase -d kingbase
exec dbms_workload_replay.process_capture('/install/db_replay_decode',1);
SELECT show_process_capture_statistics();
--4、备份数据库data目录。
sys_ctl stop -D /install/KES/bin/data
cp -r /install/KES/bin/data /install/KES/bin/databak
sys_ctl start -D /install/KES/bin/data
--二、KReplay重放(节点50)
--1、调整max_worker_processes,以便于生成回放所需的后台进程。
su - kingbase
echo 'max_worker_processes=6' >> /install/KES/bin/data/kingbase.conf
sys_ctl restart -D /install/KES/bin/data
--2、用管理员kingbase连接数据库kingbase。
--3、初始化重放,解析关于会话连接的信息。。
ksql -U kingbase -d kingbase
exec dbms_workload_replay.initialize_replay('replay1','/install/db_replay_decode');
SELECT replay_id, conn_id, capture_user, capture_conn
FROM dbms_database_replay.workload_connection_map;
--4、生成重映射SQL命令。
SELECT 'exec dbms_workload_replay.remap_connection(' ||conn_id|| ','||'''192.168.40.111'''||', 54321, '||'''test'''||');'
FROM DBA_WORKLOAD_CONNECTION_MAP
WHERE capture_user='SPACE01';
--5、执行重映射SQL命令。
exec dbms_workload_replay.remap_connection(2, '192.168.40.111', 54321, 'test');
exec dbms_workload_replay.remap_connection(3, '192.168.40.111', 54321, 'test');
--6、设置重放模式、加压或减压策略。
set dbms_database_replay.debug_level = 3;
exec dbms_workload_replay.prepare_replay('TIME', 100, 100);
--7、开始数据库重放操作。
exec dbms_workload_replay.start_replay();
\x
SELECT * FROM dba_workload_replays;
\x
--三、重放结束后,源端、目标端数据比对(节点111)
--1、手工进行数据比对。
ksql -U space01 -d test
\dt+ space01.*
SELECT count(*) FROM space01.space_layout_dtl;
SELECT count(*) FROM space01.space_seg_dtl;
--2、通过KFSMC进行数据比对。
--四、重放结束后,收集重放报告(节点50)
--1、查看重放信息,生成重放报告。
SELECT dbms_workload_replay.get_replay_info('/install/db_replay_decode');
SELECT dbms_workload_replay.report(1,'HTML');
SELECT dbms_workload_replay.report(1,'TEXT');
--五、收集目标端KES的KWR、KSH、KDDM报告(节点111)
--1、根据重放对应的开始和结束快照id,生成对应的KWR报告。
ksql -U system -d test
SELECT * FROM perf.kwr_snapshots;
SELECT * FROM perf.create_snapshot();
SELECT * FROM perf.kwr_snapshots;
SELECT perf.kwr_report_to_file(1,2,'html','/home/kingbase/kwr_1_2.html');
SELECT perf.ksh_report_to_file_by_snapshots(1,2,'/home/kingbase/ksh_1_2.html','html');
SELECT perf.kddm_report_to_file(1,2,'/home/kingbase/kddm_1_2.txt');
关于作者:
网名:飞天,墨天轮2024年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证、MySQL 8.0 OCP认证以及OBCA、KCP、KCSM、ACP、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgresSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~
最后修改时间:2025-05-07 14:50:50
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




