暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

【金仓数据库】使用kreplay实现业务负载重放

原创 飞天 2025-04-30
544

KReplay 技术介绍

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

流程图如下:
image.png

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论