过去两天我一直在搞乱这个问题,我仍在试图解决这个问题......
作为更大脚本的一部分,我有以下命令,我试图在php文件中运行:
$export = exec("/usr/bin/mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products > /path/to/www/directory/sync/products.sql");
这个命令不起作用,如果我添加并回显$result_var
,我得到127而不是0,所以显然有些错误。经过一些研究,我设法得出了一个稍微不同的命令,它运作得很好:
$export = exec('mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products -r "/path/to/www/directory/sync/products.sql"');
我的第一个问题 - 有什么区别?为什么第一个选项不起作用?
也许值得一提:在mysqldump
上使用路径没有任何区别。我做了which mysqldump
并且第一个命令中的路径是正确的。
我的第二个问题 - 我试图运行以下命令将表格导入我的数据库:
$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -p MY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')
但它没有用,没有任何反应。如果我在命令行中运行它,它只会抛出帮助文本,就好像我运行了mysql -?
我在这里缺少什么?我需要在mysql命令中添加其他参数(选项)吗?如果是这样,发生了什么变化?这段代码在另一台服务器上运行得很好......
答案 0 :(得分:1)
我可以立即解决-r问题。 -r问题很可能与你的第二个问题直接相关。
mysqldump上的-r开关是--result-file的简短版本。这个开关有两个基本的东西:
- 它会停止\ n在Windows上由\ r \ n转换行结尾。如果你在Windows机器上这样做,这可能就是为什么需要-r的原因。
- 即使出现错误,它也会强制转储。这可以解释为什么你创建的转储没有正确插入。你检查了你的转储文件,以确保它没关系?
醇>所以,这不是一个完全正确的解决方案,但可能有助于让您朝着正确的方向前进:检查您的转储文件并查看它是否存在问题。
修改强>
如果你的源数据库中有utf-8,这可能是一个字符编码问题。
首先检查你的centos机器的字符集
cat /etc/sysconfig/i18n
看看它是不是utf-8。如果不是这可能是为什么-r是必需的。
然后测试你的两个dbs,看看他们的字符集是什么
select schema_name as 'database', default_character_set_name as 'charset', default_collation_name as 'default_collation' from information_schema.schemata;
如果您的源数据库是utf-8而您的目标数据库不是,这可以解释为什么插入不起作用。你可以尝试将它添加到你的导入mysql调用:
--default-character-set=utf-8
但是,如果您的mysql未设置为处理utf-8,可能会导致一组完整的错误
答案 1 :(得分:1)
再次回答我自己的问题......
我的问题是由php safe_mode引起的 - 在禁用safe_mode并为用户启用正常的shell访问后,现在一切正常。
此外,一个小细节 - mysql
命令需要-p
之后没有空格的密码。换句话说,
$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -p MY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')
不是有效命令,-p
必须后跟密码没有空格。有效命令是:
$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -pMY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')
我希望这有助于某人...