以最少的停机时间将 300 GB mysql 数据库从一台服务器干净地迁移到另一台服务器

AJA*_*JAY 4 mysql replication mysqldump restore master-master-replication

我有一个 300 GB 的 mysql 数据库,我想将其迁移到另一台服务器,以便在两者之间设置 Master-Master 复制,我的主要目标是在尽可能减少停机时间的情况下实现这一目标。

我的数据库只有一个大约 30GB 的表,其中全天候进行插入操作。所有其他表都是历史表(静态)。

1)在这种情况下,最好的前进方式是什么?

  • 获取整个数据库的 mysqldump 并将转储传输到其他服务器并将其导入新服务器将完成我想要实现的工作,但会花费大量停机时间(可能超过 14 小时),这是不允许的。

  • 或者我可以在不停止 mysql 的情况下为静态表进行单独的表转储并将其导入新服务器,在这一切结束之后,为单个活动表停机,以便不会发生新的插入并且我的两个数据库都将同步? 首先有没有可能做这样的事情?如果可能的话,在设置​​主-主复制时可能会出现什么问题?

  • 或者有没有其他方法可以减少停机时间?

Rol*_*DBA 6

这个解决方案可以用 mysqldump 来完成,但有一点风险

为了这个例子,假设你有以下内容:

  • 数据库名称是 mydb
  • 源数据库服务器的私有 IP 是 10.20.30.40
  • 目标数据库服务器的私有 IP 是 10.20.30.50
  • 用户root在源和目标数据库服务器上
  • 密码whatever在源和目标数据库服务器上
  • 两台服务器上的二进制日志都命名为 mysql-bin

这是你的步骤

步骤 01:创建复制用户

在 Live Master 上,运行以下命令

CREATE USER repluser@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repluser@'%';
Run Code Online (Sandbox Code Playgroud)

步骤 02:设置复制

在目标数据库服务器上,运行以下命令:

如果您在源服务器和目标服务器上启用了 GTID,请执行以下操作:

CHANGE MASTER TO
master_host='10.20.30.40',
master_port=3306,
master_user='repluser',
master_password='replpass',
master_auto_position=1;
Run Code Online (Sandbox Code Playgroud)

如果您没有在源服务器和目标服务器上启用 GTID,请执行以下操作:

CHANGE MASTER TO
master_host='10.20.30.40',
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)

步骤 03:创建一个脚本来执行实时 mysqldump 和加载

创建一个名为的 shell 脚本 live_dump_and_load.sh

将以下几行放入其中

MYSQL_USER=root
MYSQL_PASS=whatever
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
DB_TO_DUMP=mydb
MYSQLDUMP_OPTIONS="--routines --triggers"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --master-data=1"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --single_transaction"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} -B ${DB_TO_DUMP}"

date > live_dump_and_load.runlog
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} | mysql -h10.20.30.50 ${MYSQL_CONN}
date >> live_dump_and_load.runlog
Run Code Online (Sandbox Code Playgroud)

步骤 04:运行 shell 脚本

chmod +x live_dump_and_load.sh
nohup ./live_dump_and_load.sh &
Run Code Online (Sandbox Code Playgroud)

STEP 05 : 监控运行日志

watch cat live_dump_and_load.runlog
Run Code Online (Sandbox Code Playgroud)

步骤 06:开始复制

当转储加载到目标服务器上时,转到目标服务器并运行

START SLAVE;
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

  • 嘿@RolandoMySQLDBA,很好的答案!我有一个问题,你提到“这个解决方案可以使用 mysqldump 完成,但有一点风险”。你说的风险是什么?谢谢 (2认同)