PHP system()使用MySQL在许多数据库上运行查询

Chr*_*nch 13 php mysql database

我有一个下面的脚本,通过380个MySQL innodb数据库,并运行各种创建表,插入,更新等,以迁移架构.它从连接到云数据库服务器的Web服务器运行.我将迁移脚本从这个问题中删除,因为我认为它不相关.

我遇到了一个问题,我正在努力寻找解决方法.

我有一个运行MySQL 5.6的4gb ram云数据库服务器.我将380个数据库与40个表迁移到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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

这是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";
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

有没有办法避免内存使用量上升,因为我进行迁移?我一次只做一个数据库.或者是表格和数据的添加原因是什么?

我能够使用服务器后代并删除了80个数据库并完成了迁移.它有800 MB免费; 我希望它能降到600mb.在迁移之前它是500mb

Cap*_*ilé 2

您的 PHP 示例没有使用太多内存,并且它没有在数据库服务器上运行,而数据库服务器就是发生故障的服务器,对吗?所以问题出在你配置的MySQL参数上。

\n\n

根据您的要点,并使用简单的MySQL 内存计算器,我们可以看到您的 MySQL 服务最多可以使用 3817MB 内存。如果发生错误时服务器只有 4GB,则很可能就是这个原因(您需要为操作系统和运行应用程序提供一些额外的内存)。增加内存或微调服务器即可解决此问题。查看有关服务器变量的 MySQL 文档页面以更好地理解每个值。

\n\n

但是,这可能不是断开连接/超时的唯一原因(但这似乎确实是您的情况,因为增加内存解决了问题)。另一个常见问题是低估该max_allowed_packet值(配置中为 16MB),因为此类脚本很容易进行超出该值的查询(例如,如果单个 具有多个值INSERT INTO table ...)。

\n\n

考虑到它max_allowed_packet应该大于您向数据库发出的最大命令(它不是 SQL 文件,而是其中的每个命令,之间的块;)。

\n\n

但是请考虑更仔细的调整,因为配置错误的服务器可能会突然崩溃,或者变得无响应\xe2\x80\x94,而它可以在不添加更多内存的情况下完美运行。我建议运行MySQLTuner-perl等性能调整脚本,它会分析您的数据、索引使用情况、慢速查询,甚至提出优化服务器所需的调整建议。

\n