【发布时间】:2016-09-01 04:19:08
【问题描述】:
我在下面有一个脚本,它遍历 380 个 MySQL innodb 数据库并运行各种创建表、插入、更新...等来迁移模式。它从连接到云数据库服务器的 Web 服务器运行。我将迁移脚本排除在这个问题之外,因为我认为它不相关。
我遇到了一个问题,我正在尝试寻找解决方法。
我有一个运行 MySQL 5.6 的 4GB 内存云数据库服务器。我将 40 个表的 380 个数据库迁移到 59 个表。大约 70% 的过程中我得到了以下错误。它在一次迁移中死了,服务器宕机了。我正在查看内存使用情况,但内存不足。它是一个数据库即服务,所以我没有对服务器的 root 访问权限,所以我不知道所有细节。
在 phppoint_smg 上运行查询
Warning: Using a password on the command line interface can be insecure.
ERROR 2013 (HY000) at line 355: Lost connection to MySQL server during query
在 phppoint_soulofhalloween 上运行查询
Warning: Using a password on the command line interface can be insecure.
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
在 phppoint_srvais 上运行查询
Warning: Using a password on the command line interface can be insecure.
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
这是 PHP 脚本的简化版本。
db_host = escapeshellarg($db_host);
$db_user = escapeshellarg($db_user);
$db_password = escapeshellarg($db_password);
foreach($databases as $database)
{
echo "Running queries on $database\n***********************************\n";
system("mysql --host=$db_host --user=$db_user --password=$db_password --port=3306 $database < ../update.sql");
echo "\n\n";
}
我的问题:
在我进行迁移时,有什么方法可以避免内存使用量上升?我一次只做一个数据库。还是增加表格和数据的原因?
我能够使用服务器后记并删除了 80 个数据库并完成了迁移。它有 800 mb 的免费空间;我预计它会下降到 600mb。迁移前为 500mb
【问题讨论】:
-
因为似乎没有时间限制:我假设这不是生产服务器是否正确?
-
我不确定你所说的时间限制是什么意思?通过使用更多可用内存完成脚本,我能够在错误发生后解决问题。但我想为将来解决这个问题。
-
我的意思是“脚本不必在一定时间内完成”。我也不完全清楚服务中断是否正常。了解您在此处运行的迁移类型也将有所帮助。如果只需要很少的数据操作,这可能根本不需要 PHP。顺便说一句:你是从 shell 运行你的脚本吗?
-
我不在乎运行需要多长时间;因为我的系统设置方式可以运行 2 个版本的代码。因此,如果脚本需要更长的时间来一一处理每个数据库,那很好。我不能有太多的停机时间,这就是为什么我有 2 个版本的代码(架构迁移之前 + 之后)。迁移gist.github.com/blasto333/b6ae212929674508bfeec338b992de52
-
您使用的是什么引擎?你有多少内存?
SHOW VARIABLES LIKE "%buffer%";可能你的 MySQL 配置不当。