寻找一种策略或工具来处理在繁忙的复制系统中将单个数据库恢复到某个时间点的问题。
我有 12 个数据库在主从复制配置中的 2 个 MySQL 5.0.77 服务器上运行。每天对只读从站进行完整转储,并且有可用的增量 SQL 转储,这些备份是异地备份,复制状态受到监控。
编辑:表是 InnoDB 和 myISAM 的混合体,因此引擎特定的解决方案不可用。
因此,如果主服务器完全故障,我可以中断复制并提升从服务器,我还可以选择重建新服务器并从越位完整备份进行配置,然后应用从从服务器每小时获取的差异。
但是我担心如何处理部分故障或单个数据库的故障。我可以想到 2 个很有可能的场景;
目前我有一堆完整的转储作为 FULL-$DATE-all-databases.sql.gz 文件,以及可以应用于完整转储的差异作为 DIFF-$DATE-all-databases.sql.gz
要将数据库 7 恢复到某个时间点,需要通过 FULL 和 DIFF 文件进行 grep,并手动应用该 sql。
我应该如何继续以便能够恢复到以前的 DIFF 转储之一到主数据库?
我需要备份到单个数据库文件,即
mysqldump --databases "database1" | gzip > database1.sql.gz
mysqldump --databases "database2" | gzip > database2.sql.gz
mysqldump --databases "database3" | gzip > database3.sql.gz
Run Code Online (Sandbox Code Playgroud)
而不是..
mysqldump --master-data --lock--all-databases --all-databases | gzip > all-databases.sql.gz
Run Code Online (Sandbox Code Playgroud)
如果我使用单独的 mysqldump 文件,主数据二进制日志会发生什么,我什至应该为主服务器恢复转储设置 --master-data 吗?
在过去 24 小时内的某个时间点,使用 DB 的几个应用程序之一对客户 SQL Server 2008 (v 9.0 SP4) 进行了一些更改。
它不是特别重要,但如果我可以转储与时间段对应的 SQL 语句,它将代表对这些应用程序如何使用表的有用见解。
我感兴趣的表不会经常更改,因此应用于这些特定表的事务日志的总行数不应非常大。
我看到了“fn_dblog”函数和 DBCC LOG('DataBaseName') 命令,似乎有相当多的相关信息,但我不知道如何进行下一步并让它们生成实际更改的报告.
这篇博文中有一些细节; http://janiceclee.com/tag/fn_dump_dblog/
USE AdventureWorks
GO
SELECT [Transaction ID], count(*)
FROM fn_dblog(DEFAULT, DEFAULT)
where AllocUnitName LIKE '%Production.TransactionHistory%'--table name
GROUP BY [Transaction ID]
HAVING COUNT(*) >= 113443 --(estimated/actual) number of deleted records
Run Code Online (Sandbox Code Playgroud)
但是我没有任何这样的细节,只有表名(如果需要,我可以得到主键)
以及另一篇博客文章,根据表命名使用类似的示例数据; http://www.sqlskills.com/blogs/paul/post/Search-Engine-QA-6-Using-fn_dblog-to-tell-if-a-transaction-is-contained-in-a-backup.aspx
USE AdventureWorks;
GO
SELECT [Current LSN], Operation, [Transaction ID], AllocUnitName FROM fn_dblog (NULL, NULL);
GO
The log record at that LSN is:
00000058:00001870:0001 LOP_MODIFY_ROW 0000:00001338 HumanResources.Employee.PK_Employee_EmployeeID
This …
Run Code Online (Sandbox Code Playgroud)