我自己编写了一个小脚本,可以生成以下 shell 命令。
echo "CHANGE MASTER TO MASTER_USER='slave_user';" | mysql -uroot -pXXX --host=SLAVE &&
echo "CHANGE MASTER TO MASTER_PASSWORD='slave_password';" | mysql -uroot -pXXX --host=SLAVE &&
echo "STOP SLAVE;" | mysql -uroot -pXXX --host=SLAVE &&
mysqldump -uroot -pXXX --host=MASTER --add-drop-database --master-data=1 --databases database1 database2 | mysql -uroot -pXXX --host=SLAVE &&
echo "START SLAVE;" | mysql -C -uroot -pXXX --host=SLAVE
它应该可以在从服务器或主服务器上运行。但是我知道,使用交换机进行压缩的优势-C
仅在主服务器上运行时才有效。
我的主服务器配置了以下设置(仅显示与默认设置不同的部分。我使用 mysql 服务器版本 5.1.41。
[mysqld]
bind-address = 0.0.0.0
max_connections = 600
server-id = 1
log_bin = /media/mysql-ebs/log_bin/mysql-bin.log
binlog_do_db = database1
binlog_do_db = database2
datadir = /media/mysql-ebs/datadir
我的从属配置如下:
server-id = UNIQUE-ID
replicate-do-db = database1
replicate-do-db = database2
该服务器运行 MyIsam 以及 InnoDB 表。
我的问题是:
- 我是否遗漏了什么?
- 即使客户端在备份期间尝试读/写,是否可以保证数据一致性?
- 此命令是否存在任何问题/注意事项/建议?
答案1
我才恍然大悟。
这是你的原始 shell 脚本
echo “将 MASTER 更改为 MASTER_USER='slave_user';” | mysql -uroot -pXXX --host=SLAVE &&
echo “将 MASTER 更改为 MASTER_PASSWORD='slave_password';” | mysql -uroot -pXXX --host=SLAVE &&
echo “停止 SLAVE;” | mysql -uroot -pXXX --host=SLAVE &&
mysqldump -uroot -pXXX --host=MASTER --add-drop-database --master-data=1 --databases database1 database2 | mysql -uroot -pXXX --host=SLAVE &&
echo “启动 SLAVE;” | mysql -C -uroot -pXXX --host=SLAVE
第一个命令应该是“STOP SLAVE;”,因为您无法对正在运行的从属执行任何 CHANGE MASTER TO 命令。因此,您的代码应为:
回显“停止 SLAVE;” | mysql -uroot -pXXX --host=SLAVE &&
回显“将 MASTER 更改为 MASTER_USER='slave_user';” | mysql -uroot -pXXX --host=SLAVE &&
回显“将 MASTER 更改为 MASTER_PASSWORD='slave_password';” | mysql -uroot -pXXX --host=SLAVE &&
mysqldump -uroot -pXXX --host=MASTER --add-drop-database --master-data=1 --databases database1 database2 | mysql -uroot -pXXX --host=SLAVE &&
回显“启动 SLAVE;” | mysql -C -uroot -pXXX --host=SLAVE
答案2
所以基本上: * 您在 SLAVE 上更改复制用户 / 密码。 * 您在从属上停止复制。 * 您将数据从主服务器转储到从属服务器 * 您启动从属服务器 我说得对吗?
在这种情况下,我认为更改密码没有任何意义。我猜你首先必须删除从服务器上的数据库,然后才能转储。在转储数据时,你需要主服务器上的日志位置,否则,你的从服务器将不知道从哪里开始复制。与其在命令行上传递密码,不如使用 .my.cnf 文件