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

tou*_*ano 9 mysql innodb myisam database-backup

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

  • MySQL服务器
  • 它们不会被复制
  • 每个服务器代表自己的

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

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

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

Rol*_*DBA 7

mysqldumps 与 InnoDB 和 MyISAM 一起被视为互斥。原因如下:

如果您可以在 mysqldump 正在进行时登录到 mysql,您将看到如下内容:

SELECT /* SQL_NO_CACHE */ * FROM tblname
Run Code Online (Sandbox Code Playgroud)

默认情况下,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 
Run Code Online (Sandbox Code Playgroud)

选项#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
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lex 5

mysqldump --single-transaction不锁定表,但不能保证 MyISAM 表具有与此选项一致的转储。最好使用mydumper,mydumper锁定 MyISAM 表并且不锁定 InnoDB,因此转储是一致的。


小智 0

mysqldump 在转储期间锁定表。使用 LVM 快照或Xtrabackup