使用 mysqldump 设置一个 MySQL slave 来获取初始数据

Jus*_*ner 6 mysql innodb myisam replication mysqldump

我有一个主数据库,其中已经有一些数据。master 数据库中的表包括 MyISAM 和 InnoDB 引擎。现在我想使用mysqldump来转储我的从 MySQL 服务器的初始数据。我应该传递给 mysqldump 的参数是什么?目前我使用的是下面列出的。

mysqldump --host=localhost --user=root --password=pa4word --single-transaction --lock-all-tables --master-data=1 mydb > result.sql
Run Code Online (Sandbox Code Playgroud)

这个命令可以吗?我不知道这是否适合我的环境(MyISAM 和 InnoDB 引擎表在一个数据库中)。

谢谢,

Rol*_*DBA 8

如果您要转储混合了 InnoDB 和 MyISAM 的 mysql 数据库,并且您已安排停机时间:

mysqldump -u... -p... --master-data=1 --single-transaction --flush-privileges --routines --triggers --all-databases > /root/mydata.sql
Run Code Online (Sandbox Code Playgroud)

由于 --opt 默认启用,以下选项已经启用

  • --add-drop-table
  • --add-locks
  • --create-options
  • --quick
  • --lock-tables
  • --set-charset
  • --disable-keys

如果您担心 mysqldump 中的 InnoDB/MyISAM 并希望将数据库置于只读状态,请尝试手动跨所有表设置读锁。

MYSQL_CONN="-hhostip -uusername -ppassword"
mysql ${MYSQL_CONN} -A -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
SEARCHING_FOR_SLEEP=0
while [ ${SEARCHING_FOR_SLEEP} -eq 0 ]
do
    sleep 3
    SEARCHING_FOR_SLEEP=`${MYSQL} ${MYSQL_CONN} -A -e"SHOW PROCESSLIST;" | grep -c "SELECT SLEEP(86400)"`
done
sleep 1
SLEEP_ID=`mysql ${MYSQL_CONN} -A -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'`

mysqldump ${MYSQL_CONN} --master-data=2 --single-transaction --flush-privileges --routines --triggers --all-databases > /root/mydata.sql

mysql ${MYSQL_CONN} -A -e"KILL ${SLEEP_ID}"
Run Code Online (Sandbox Code Playgroud)

这样做更好的原因是--single-transaction不能保护 MyISAM 在转储期间不会发生变化。

在启动 mysqldump 之前,请确保在 master 上启用了二进制日志记录。如果不是,请执行以下操作:

步骤 01) 将此添加到主服务器上的 /etc/my.cnf

[mysqld]
log-bin=mysql-bin
Run Code Online (Sandbox Code Playgroud)

步骤 02) service mysql restart

这将在主服务器上启用二进制日志记录。

在新的从站上,您可以运行以下命令:

CHANGE MASTER TO
MASTER_HOST='IP of the master',
MASTER_PORT=3306,
MASTER_USER='whatever_username',
MASTER_PASSWORD='whatever_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
Run Code Online (Sandbox Code Playgroud)

确保 master 中存在 rep_username。如果没有,请在主服务器上运行此命令:

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT
ON *.* TO 'whatever_username'@'%' IDENTIFIED BY 'whatever_password';
Run Code Online (Sandbox Code Playgroud)

然后执行mysqldump 到/root/mydata.sql。

将 /root/mydata.sql 从 master 移动到 slave。

接下来,在mysql客户端在slave上执行这条命令:

source /root/mydata.sql
Run Code Online (Sandbox Code Playgroud)

这将在从站中加载 mysqldump 并在 /var/lib/mysql/master.info 中设置正确的日志文件和日志位置。

最后,START SLAVE;在从服务器上运行,mysql 复制应该开始了。

运行SHOW SLAVE STATUS\G以检查复制状态。

试一试 !!!