![将实时 innodb 数据库从一台服务器移动到另一台服务器](https://linux22.com/image/668019/%E5%B0%86%E5%AE%9E%E6%97%B6%20innodb%20%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BB%8E%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%8F%A6%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我需要将 innodb 数据库从一台服务器移到另一台服务器 - 它也是从 mysql > mariadb。我想确保没有任何问题,并且我将使用 mysqldump 导出,然后在新服务器上导入。新服务器上的 my.cnf 设置不同,因此复制文件不是我想要尝试的事情。我也不完全担心停机时间,只要它能确保良好的转储/导入而没有问题即可。
因为这是一个实时数据库,所以我担心由于事务或其他任何原因导致的转储错误,当将其导入新服务器时会导致约束问题/损坏。
这里最好的程序是什么? 这是我的想法...
- 在没有用户访问的情况下重新启动 mysql,这样就没有人可以读取/写入数据库。
- mysqldump 与
mysqldump -u [username] -p[password] -h [host] [databaseName] > [backup-name].sql
- 导入
mysql -u [username] -p[password] -h [host] [databaseName] < [filename].sql
是否可以重新启动 mysql 并锁定所有用户?这是否可以解决任何遗留事务并确保导入时数据合法?基本上,一旦我开始备份过程,我就想永远“关闭”对数据库的访问,因为一旦将其导入到新服务器上,就永远不需要再次访问它,更重要的是,我不希望在转储/恢复到其他服务器期间访问它。当然,如果出现导入问题,我希望将数据库留在原始服务器上。
答案1
注意,如果数据库中有任何加密字段,则必须使用--hex-blob
with 。如果不使用,则导入时数据将变得无用。mysqldump
--hex-blob
备份之前,请执行FLUSH TABLES WITH READ LOCK
操作以防止任何更改。您可以一步将备份传输到新服务器,从而省去复制 SQL 文件的步骤。
mysqldump --single-transaction --routines --triggers --events --hex-blob db-name | mysql -h server db-name
答案2
您应该做的第一件事就是备份您的数据库,然后将其导入新服务器并先测试新服务器,如果一切正常,还要检查创建备份和恢复到新服务器所花费的时间,这样您就知道将新服务器投入生产需要多长时间。
当您准备将所有内容传递到新服务器时,最好停用与数据库的所有连接,除非 localhost,因为您将使用 mysqldump 访问数据库并进行备份,如果对数据库的所有访问都来自您的 Web 服务器,您可以关闭 Web 服务器,另一种方法是配置 iptables 以阻止除 localhost 之外的 mysql 端口上的所有流量。然后备份数据库,还原到新服务器并设置新服务器,并确保所有连接都将转到新服务器。
答案3
这一切都取决于你的数据库是否足够大或足够小,也取决于你正在运行什么服务,但我想必须有一些维护窗口,在周末深夜,关闭你的 apache/nginx,你也可以在禁用网络、防火墙或不同的本地端口的情况下重新启动数据库。导出:
mysqldump -p --single-transaction --routines --triggers --events DATABASE | gzip > backup.sql.gz
进口:
zcat backup.sql.gz | mysql -f -p DATABASE
重新检查:
mysql_upgrade -p -f
压缩和猫 将帮助你更快地完成它。