不停止主服务器的 MySQL 复制

JCS*_*JCS 3 mysql replication

我目前正在为我的数据库设置复制,我正在考虑在不写锁定主站的情况下同步主站和从站的方法之一,是首先获取日志位置然后执行备份,然后在从站上恢复备份并开始具有日志位置的从站(将在进行备份之前),我看到这种方法的问题之一是从站将重新应用对其自身的更改,这在我们拥有的系统类型中不是问题,是否任何其他人看到这种方法的任何其他陷阱?或者有没有其他更好的选择来实现这一目标?

Rol*_*DBA 12

您可以尝试两种不停机或停机时间最短的方法

鉴于以下情况:

  • 主IP是 10.1.20.30
  • 从属 IP 是 10.1.20.40

方法 #1:数据是 100% InnoDB

这是非常简单的。

STEP01) 如果 Master 没有server-id在 my.cnf 中定义,你必须添加它

[mysqld]
server-id=100
Run Code Online (Sandbox Code Playgroud)

STEP02) 如果log-bin在 my.cnf中没有定义Master,则必须添加它

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

STEP03) 如果您已经在 Master 上执行了第 1 步和/或第 2 步,请执行service mysql restart(强制)

STEP04) 在 Master 上创建 MySQL 复制用户

mysql> GRANT SELECT,REPLICATION USER,REPLICATION CLIENT ON *.*
TO repluser@'10.1.2.30' IDENTIFIED BY 'replpass';
Run Code Online (Sandbox Code Playgroud)

STEP05) 在 Master 上创建一个 mysqldump 作为时间点快照

MYSQL_CONN="-uroot -ppassword"
MYSQLDUMP_OPTIONS="--master-data=1 --single-transaction --flush-privileges"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --routines --triggers --all-databases"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} > MySQLData.sql 
Run Code Online (Sandbox Code Playgroud)

完成后,第 22 行MySQLData应该有 mysqldump 启动时 Master 的二进制日志和位置。要看到它,只需运行

head -22 MySQLData.sql | tail -1
Run Code Online (Sandbox Code Playgroud)

STEP06) 在 Slave 上创建复制状态

CHANGE MASTER TO
MASTER_HOST='10.1.20.30',
MASTER_PORT=3306,
MASTER_USER='repluser',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
Run Code Online (Sandbox Code Playgroud)

STEP 07) 将 mysqldump 加载到 Slave

mysql -u... -p... < MySQLData.sql 
Run Code Online (Sandbox Code Playgroud)

不要担心从正确的位置开始复制。请记住,我说过第 22 行包含具有正确二进制日志和位置的命令。

步骤 08) 运行 SHOW SLAVE STATUS\G

如果Slave_IO_RunningYesSlave_SQL_RunningYes,恭喜!!!

方法 #2:数据是 InnoDB/MyISAM 混合

与其重新发明轮子,不如阅读我之前关于使用 rsync 制作 Slave 的帖子

试一试 !!!

  • @rinogo 根据该文档,确保在 mysqldump 期间不运行任何 DDL。否则,它将触发隐式提交,然后转储从那时起变得不一致。 (2认同)