我需要改进无法加载生产服务器的数据库的备份。我读到,实现此目的的好方法是设置数据库复制并在从属服务器上执行 mysqldump。
但是“replicate_do_db”的描述说更新不适用于跨数据库查询。这里有一个问题 - 我有很多 PHP 应用程序(其中一些真的很旧),所以我不能保证它们不使用这种查询。而且我不想有不同步的数据库......
还有其他选择吗?或者只对知名应用程序使用复制,而对其他应用程序使用 mydumper/mysqldump?
我知道 Percona XtraBackup 存在,但我想以 .sql 格式进行备份。
答案1
replicate_do_db
告诉系统应该为哪些数据库复制 SQL 查询(我假设是 SQL 复制,而不是行复制)。
工作原理如下,假设replicate_do_db = DB_1
mysql> use DB_1;
mysql> insert into Table_1 values (1,2,3);
现在此插入语句将被复制到从属主机。
mysql> use DB_2;
mysql> insert into DB_1.Table_1 values (2,3,4);
此插入语句将不是被复制,因为您正在 DB_2 中工作,而它不会被复制,即使您碰巧在查询中指定了 DB_1。
mysql> user DB_1;
mysql> insert into DB_2.Table_2 values (9,8,7);
此插入语句将要被复制,因此如果从属主机没有 DB_2.Table_2,则复制将中断。
这就是跨数据库查询问题的简单介绍。请注意,跨不同数据库的 select 语句不是问题,因为只复制修改数据的语句,而不复制查询数据的语句。
据推测,如果主服务器有多个在应用程序中使用和更新的数据库,您将希望将这些更新全部复制到从属主机,因此您需要使用指定所有这些数据库replicate_do_db
;正如您所描述的,我不希望在您的情况下出现问题。
只需确保您对复制状态进行某种监控,这样如果复制确实中断,您就会尽快意识到问题,并在复制数据变得太旧之前修复它。提示:show slave status;
在从属主机上检查“Slave_IO_Running”和“Slave_SQL_Running”是否都为“是”。
我还mk-table-checksum
每天晚上都会比较主服务器和从服务器,以查看数据库表是否相同。