AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 6271
Accepted
geoaxis
geoaxis
Asked: 2011-09-29 08:33:02 +0800 CST2011-09-29 08:33:02 +0800 CST 2011-09-29 08:33:02 +0800 CST

MySQL数据库中毒:如何快速恢复到已知状态

  • 772

如果您想避免数据库中毒(即想快速恢复到某个时间点),您更喜欢哪种方法?

让我来定义数据中毒。您在数据库中插入了一些东西,这完全弄乱了内部结构和相互依赖性。我知道这意味着数据库设计可能也需要重新审视,但损害已经造成。

我想到的方法是

  1. 以某种方式设置复制,其中从服务器是被动的并且落后 X 小时。如果出现故障,我所要做的就是重置应用程序并将其指向作为我的新主控的从属。我怀疑这是可能的。
  2. 每隔几个小时对 MySQL 进行一次热备份,当检测到故障时恢复到 X 小时前的备份。这将意味着应用程序停机,因为我不能让当前应用程序继续运行。可以使用 innobackup 或 percona 进行快速备份和恢复步骤。
  3. 专门设计应用程序和数据库,以便新添加的数据被删除(或搁置)。这意味着我存储所有事件/状态(我想这是最困难和理论上的解决方案)

如果第一个选项可行并且它还存储所有中继日志(即 Master 上发生的任何事情都会在同一时刻传输到 Slave,但会在几个小时内自动应用)那么这将是一个完美的解决方案。也许可以在一个设置中设置多个从站以从中断和数据中毒中恢复

mysql replication
  • 4 4 个回答
  • 666 Views

4 个回答

  • Voted
  1. Best Answer
    user4939
    2011-09-29T15:16:49+08:002011-09-29T15:16:49+08:00

    您可以使用 Percona Toolkit 中的 pt-slave-delay 工具让副本延迟您选择的时间量。

    • 5
  2. Derek Downey
    2011-09-29T10:03:30+08:002011-09-29T10:03:30+08:00

    我通常设置一个专门用于备份的从站。这样我就可以STOP SLAVE,备份,和START SLAVE。执行此方法将允许您在白天进行任意数量的备份,而无需在主服务器上停机。

    如果你愿意,你可以在它恢复日志后手动关闭从站。将其复制回主服务器可能会有一些停机时间,但随后您可以重播二进制日志,直到数据“中毒”为止。

    • 2
  3. RolandoMySQLDBA
    2011-09-29T10:00:10+08:002011-09-29T10:00:10+08:00

    您肯定需要 Master/Master 和 DBVIP 的使用

    首先,让我们设置循环复制

    让 db1 : Master, db2 : Slave

    1. 使用现有的 db1 作为 Master
    2. 在 db2 上安装 mysql(在 db1 和 db2 上安装相同的版本)
    3. 确保 mysql 没有在 db2 上运行
      • 添加server-id=1到db1:/etc/my.cnf
      • 添加log-bin=mysql-bin到db1:/etc/my.cnf
      • 添加log-slave-updates到db1:/etc/my.cnf
      • 添加skip-slave-start到db1:/etc/my.cnf
      • service mysql restart在 db1 上
    4. 复制 db1:/etc/my.cnf 到 db2:/etc/my.cnf
    5. 在 db2 中更改server-id=1为:/etc/my.cnfserver-id=2
    6. RESET MASTER;在 db1 上
    7. service mysql stop在 db1 上
    8. rm -f /var/lib/mysql/mysql-bin.* 在 db1 上
    9. rsync db1:/var/lib/mysql 到 db2:/var/lib/mysql
    10. service mysql start在 db2 上
    11. CHANGE MASTER TO MASTER_HOST='HostIP of db1',MASTER_PORT=3306, MASTER_USER='replusername',MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=<number>;在 db2 上(注意:MASTER_LOG_POS 在 MySQL 5.1 之前是 98,MySQL 5.1 是 106,MySQL 5.5 是 107)
    12. service mysql start在 db2 上
    13. START SLAVE;在 db2 上让复制赶上来 (Seconds_Behind_Master=0)
    14. CHANGE MASTER TO MASTER_HOST='HostIP of db2',MASTER_PORT=3306, MASTER_USER='replusername',MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=<number>;在 db1 上
    15. START SLAVE;在 db1 上让复制赶上(Seconds_Behind_Master=0)

    一旦你有了循环复制,你现在可以通过在 db2 上运行来在某个时间点冻结STOP SLAVE;​​ db2

    接下来,在 db1 上创建一个 DBVIP(示例:192.168.10.1)

    ip addr add 192.168.10.1/24 dev eth1
    

    使用 DBVIP 执行所有数据库读取和写入

    如果您想要更新 db2,只需START SLAVE;在 db2 上运行并让复制赶上来。

    如果您想及时回到 db2 所在的位置,您可以执行那里的步骤

    • service mysql stop在 db1 上
    • rm -f mysql-bin.*在 db1 上
    • rm -f master.info在 db1 上
    • ip addr del 192.168.10.1/24 dev eth1在 db1 上
    • ip addr add 192.168.10.1/24 dev eth1在 db2 上
    • CHANGE MASTER TO MASTER_HOST='';在 db2 上
    • RESET MASTER在 db2 上(Hoses 二进制日志)
    • service mysql stop在 db2 上
    • rsync db2:/var/lib/mysql 到 db1:/var/lib/mysql
    • service mysql start在 db2 上
    • service mysql start在 db1 上

    如果可以通过跳过您正在同步的数据库服务器的 mysql 关闭来加快这些步骤。这只需要在数据库目标服务器上进行一些额外的清理。

    这些步骤只是指南。您可能会发现我的某些步骤有点偏执。随意使用你喜欢的东西。

    • 1
  4. dabest1
    2012-05-23T09:57:03+08:002012-05-23T09:57:03+08:00

    除了使用 Percona 的 pt-slave-delay 工具之外,另一种选择是为每个基表设置历史/审计表,它将跟踪对数据内容的所有更改,并将包含插入、更新和删除时间戳以及实际内容。您需要创建触发每个插入、更新和删除语句的触发器,然后插入到历史/审计表中。要扭转损失,您需要阅读历史/审计表并将更改应用于基表。

    例如,DBIx::Class::Journal是一个从代码端自动实现这种模式的 perl 模块。如果您访问该 URL,您会看到该模块在捕获数据内容更改方面进行了相当深入的研究。日志模式包含如下表:

    ChangeSet
    ChangeLog
    AuditLog
    AuditHistory
    

    对于您的设置,您可能希望从每个基表都有一个历史表开始。

    • 0

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve