与MyISAM混合使用时,InnoDB表在mysqldump期间是否被锁定?


9

我正在寻找适用于mysql服务器的备份解决方案,并且我需要的停机时间尽可能短。我有以下几点:

  • MySQL服务器
  • 他们没有被复制
  • 每个服务器代表自己的服务器

这个数字可能会增加,因此设置主/从复制不是一个好主意。

我认为最简单的备份方法是将mysqldump与“ automysqlbackup”之类的软件一起使用。我最重要的数据使用InnoDB。我的InnoDB表很重。

问题是:如果我对服务器中的所有数据库执行mysqldump,它将锁定我的Innodb表吗?

Answers:


7

带有InnoDB和MyISAM的mysqldumps被视为互斥的。原因如下:

如果您可以在进行mysqldump的同时登录mysql,则会看到以下内容:

SELECT /* SQL_NO_CACHE */ * FROM tblname

默认情况下,mysqldump将执行以下操作:

  • 每个数据库都按字母顺序转储
  • 每个数据库转储的每个表都按字母顺序转储(与存储引擎无关)

对于没有其他数据库活动的MySQL实例,这应该很好。InnoDB表和MyISAM表不会相互影响。

使用--single-transaction针对全InnoDB的MySQL实例创建一个检查点并转储从同一个点在时间中的所有表。一旦遇到MyISAM表,所有的赌注都将关闭。这可能导致从另一个时间点转储MyISAM之后的所有InnoDB表。

要对InnoDB和MyISAM的混合物进行一致的时间点转储,您可以选择

选项1

重新启动mysql,以便其他人无法通过TCP / IP登录,然后mysqldump

service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 

选项#2

如果所有MyISAM表仅用于读取,则只需使用--single-transaction进行mysqldump

选项#3

如果正在写入任何MyISAM表,则--single-transaction是不够的

您将执行以下操作:

mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql

mysqldump完成后,立即登录mysql并执行do show processlist;。查找查询SELECT SLEEP(86400),找到进程ID,然后运行KILL <procidnumn>;


5

mysqldump --single-transaction不锁定表,但不能保证MyISAM表使用此选项具有一致的转储。最好使用mydumpermydumper锁定MyISAM表而不锁定InnoDB,以便转储是一致的。


哇,感谢您提供的出色工具!您是否熟悉可以使用mydumper自动执行每日,每周,每月备份的工具?像mydumper一样的“ automysqlbackup”?谢谢。
tounano

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.