我正准备将数据库从一台服务器移到另一台服务器。为了减少客户端的停机时间,我想知道我是否可以打开复制功能并给它时间进行完全复制,然后将客户指向新服务器。
我遇到的问题是,我要迁移到的服务器有其他客户的现有活跃数据库。而我要迁移的服务器有其他活跃客户,他们目前不会迁移。
这有可能吗?如果可能,我该如何配置要迁移的服务器和要迁移到的服务器?
答案1
是的——mysql 服务器可以同时作为主服务器和从服务器。
如果您使用 innodb 作为该数据的存储引擎并且移动整个数据库,则应该可以:
- 在旧服务器上启用 binlogging
- 从旧服务器进行完全一致的转储,而不阻止任何正在进行的流量
- 将转储转移到新服务器,然后在那里恢复
- 为选定的数据库启用复制,并允许新服务器“赶上”生产机器
- 一旦服务器需要同步数据库 - 切换流量
这可能会有所帮助:
- pt-表校验和检查你的表/数据库是否同步
- pt-表同步在新服务器上拥有大部分数据后解决潜在问题
- mysql 对复制的过滤 - 在主服务器(旧服务器)上 -binlog-do-db或从属[新服务器]端 -复制-do-db
- mysqldump 的主要的数据和单笔交易进行初始数据转储的选项
附言:我假设新旧服务器之间的数据库名称没有重叠。
答案2
是的当然。
您应该实现的想法称为 MySQL 循环复制。
例如,假设您有以下内容:
- DBServer1 有数据库 db1、db2、db3、db4
- 您想将 db3 和 db4 移动到 DBServer2
- 您想要限制对 DBServer1 上的 db1 和 db2 的读写
- 您想要限制对 DBServer2 上的 db3 和 db4 的读写
你可以尝试以下方法
STEP01)GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO replicator@'%' IDENTIFIED BY 'replpass';
在DBServer1上运行
步骤02)在 DBServer2 上安装相同版本的 MySQL(您将在 /var/lib/mysql 中拥有默认数据)
步骤03)rsync DBServer1:/var/lib/mysql DBServer2:/var/lib/mysql
STEP04)重复STEP02,直到两次连续的rsync时间相同,最好小于2分钟。
步骤05)禁止你的应用程序向数据库写入任何内容
service mysql stop
DBServer1 上的步骤06)
步骤07)在 DBServer1 上配置二进制日志
将此添加到 DBServer1 上的 /etc/my.cnf 中
[mysqld]
server-id=1
log-bin=mysql-bin
将此添加到 DBServer2 上的 /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
步骤 08) rsync DBServer1:/var/lib/mysql DBServer2:/var/lib/mysql (最终 RSYNC)
STEP09)service mysql start
在 DBServer1 上(二进制日志将开始填充)
STEP10)service mysql start
在 DBServer2 上(二进制日志将开始填充)
步骤11)将 db1 和 db2 的应用程序指向 DBServer1
步骤12)将 db3 和 db4 的应用程序指向 DBServer2
步骤13)在DBServer1上运行此命令
CHANGE MASTER TO
MASTER_HOST='xxx.xx.xx.xxx',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=PPPP;
步骤14)在DBServer2上运行此命令
CHANGE MASTER TO
MASTER_HOST='yyy.yy.yy.yyy',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=PPPP;
对于步骤 13 和 14
- xxx.xx.xx.xxx 是 DBServer2 的私有 IP 地址
- yyy.yy.yy.yyy 是 DBServer1 的私有 IP 地址
- PPPP 是任何二进制日志的初始位置
- 对于 MySQL 5.5,PPPP 为 107
- 对于 MySQL 5.1,PPPP 为 106
- 在MySQL 5.1之前,PPPP是98
STEP15)START SLAVE;
在DBServer1上运行
STEP16)START SLAVE;
在DBServer2上运行
STEP17)SHOW SLAVE STATUS\G
在DBServer1上运行,直到Seconds_Behind_Master为0
STEP18)SHOW SLAVE STATUS\G
在 DBServer2 上运行,直到 Seconds_Behind_Master 为 0
这种实现方式不仅允许数据库的拆分,而且还允许数据库的备用服务器。
DBServer1 将成为 db1 和 db2 进行读写操作的地方。它还提供 db3 和 db4 的备份。
DBServer2 将成为 db3 和 db4 进行读写操作的地方。它还提供 db1 和 db2 的备份。
试一试 !!!