我正在寻找 mysql 服务器的备份解决方案,并且需要尽可能减少停机时间。我有以下情况:
- MySQL 服务器
- 它们无法复制
- 每个服务器都有自己的
这个数字可能会增长,因此设置主/从复制不是一个好主意。
我认为最简单的备份方法是使用 mysqldump 和“automysqlbackup”等软件。我最重要的数据使用 InnoDB。我的 InnoDB 表相当重。
问题是:如果我对服务器中的所有数据库执行 mysqldump,它会锁定我的 Innodb 表吗?
答案1
mysqldumps 与 InnoDB 和 MyISAM 一起被视为互斥。原因如下:
如果您可以在 mysqldump 正在进行时登录到 mysql,您将看到类似这样的内容:
SELECT /* SQL_NO_CACHE */ * FROM tblname
默认情况下,mysqldump 将执行以下操作:
- 每个数据库都按字母顺序转储
- 每个数据库转储的每个表都按字母顺序转储(无论存储引擎如何)
对于没有其他数据库活动的 MySQL 实例来说,这应该没问题。InnoDB 表和 MyISAM 表不会互相影响。
针对全 InnoDB MySQL 实例使用--single-transaction
会创建一个检查点并从同一时间点转储所有表。一旦遇到 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 并执行show processlist;
。查找查询SELECT SLEEP(86400)
,找到进程 ID,然后运行KILL <procidnumn>;
答案2
mysqldump --single-transaction
不锁定表,但使用此选项不能保证 MyISAM 表具有一致的转储。最好使用mydumper
,mydumper
锁定 MyISAM 表而不锁定 InnoDB,这样转储就是一致的。
答案3
mysqldump 在转储期间锁定表。使用 LVM 快照或备份软件。