如何利用归档日志恢复数据库到另一个库中

2025-02-23 09:41:12
推荐回答(2个)
回答1:

更快速的配置对比 pt-config-diff在我们日常工作中,大家一定遇到过以下场景:

若干套 MySQL 环境,只有一套:

∘ 行为异常,怀疑触发 bug

∘ 性能异常,比其他环境都要低

在这种场景下,我们一般的做法是首先控制变量,查看软硬件配置,以及 MySQL 的参数配置。关于 MySQL 的参数配置对比,如果我们人工对比的话只会关注某些重点参数,而缺少了整体细节上的的对比。在这里我们推荐给大家 Percona Toolkit 中的一个工具 pt-config-diff。更准确的复制延时 pt-heartbeat在 MySQL 中,复制延迟可以理解为由两部分组成:1. 主库已经生成了 BINLOG,但是还没有发送给从库 -- 我们在这里称之为:日志延迟2. 从库已经接收到了 BINLOG,但是还没有应用完成 -- 我们在这里称之为:应用延迟MySQL 原生的查看复制延迟的手段为:show slave status\G中的Seconds_Behind_Master。这种观测手法只能观测出应用延迟。在异步复制或降级的半同步复制下,误差较大,无法准确的反映出整体复制延时。

1. 在 Master 上循环插入:insert into database.heartbeat (master_now) values(NOW())

2. database.heartbeat 的变更会跟随主从复制流向从库

3. 系统当前时间 - 从库表中的时间 = 从库实际的复制延时

更简单的参数配置建议 pt-variable-advisortoolkit 中包含了一个简单的 MySQL 参数优化器,可以对参数配置做简单的优化建议。

更准确的复制延时 pt-heartbeat在 MySQL 中,复制延迟可以理解为由两部分组成:1. 主库已经生成了 BINLOG,但是还没有发送给从库 -- 我们在这里称之为:日志延迟2. 从库已经接收到了 BINLOG,但是还没有应用完成 -- 我们在这里称之为:应用延迟MySQL 原生的查看复制延迟的手段为:show slave status\G中的Seconds_Behind_Master。这种观测手法只能观测出应用延迟。在异步复制或降级的半同步复制下,误差较大,无法准确的反映出整体复制延时。

更易用的调试工具 pt-pmp在某些情况下,我们肯定会遇到某些故障无法从日志,以及状态命令中找到原因,需要深入到程序逻辑级别。又或者我们需要立即通过非常规手段恢复故障数据库,但是又想保留足够多的故障信息。来避免我们事后复现问题的头疼。pt-pmp 便是在这种场景下帮助我们的工具。它会使用 gdb 来打印 mysqld 的堆栈信息,并把调用链相同的线程堆栈合并。堆栈合并的功能对于 MySQL 这种多线程的应用非常有帮助,会节省我们大量的时间。

回答2:

首先在init.ora初始化参数文件中,指定数据字典文件的位置,也就是添加一个参数UTL_FILE_DIR,该参数值为服务器中放置数据字典文件的目录。如:
UTL_FILE_DIR = (/Oracle/logs)
第一步:进入数据库,将数据库当前数据字典分析出来,生成数据字典文件
BEGIN
dbms_logmnr_d.build(dictionary_filename=>'dict.ora',
dictionary_location=>'/oracle/logdict');
END;
/
第二步:将需要分析的归档文件添加到分析列表,如果要分析多个日志文件就添加多个
BEGIN
dbms_logmnr.add_logfile(options=>dbms_logmnr.addfile,
logfilename=>'/Data/arch1/1_24374.dbf');
END;
/
BEGIN
dbms_logmnr.add_logfile(options=>dbms_logmnr.addfile,
logfilename=>'/Data/arch1/1_24375.dbf');
END;
/
BEGIN
dbms_logmnr.add_logfile(options=>dbms_logmnr.addfile,
logfilename=>'/Data/arch1/1_24376.dbf');
END;
/
BEGIN
dbms_logmnr.add_logfile(options=>dbms_logmnr.addfile,
logfilename=>'/Data/arch1/1_24377.dbf');
END;
/
第三步:查看当前分析列表
select filename from v$logmnr_logs;
第四步:进行分析
BEGIN
dbms_logmnr.start_logmnr(
dictfilename => '/Data/dict/dict.ora',
starttime => to_date('2011-02-25 09:15:00','YYYY-MM-DD HH24:MI:SS'),
endtime => to_date('2011-02-25 09:20:00','YYYY-MM-DD HH24:MI:SS'));
END;
/
第五步:查询分析结果
spool dict.log
set echo off
set termout off
set lines 3000
select operation,sql_redo,sql_undo from v$logmnr_contents where seg_name='R_WIP';
spool off
第六步:结束分析
execute dbms_logmnr.end_logmnr