使用mysqldump从远程MySQL单表分文件导出失败求助
解决远程MySQL使用mysqldump --tab参数导出单个表文件的问题
我之前也踩过这个一模一样的坑!当你用--tab参数连接远程MySQL时,这个参数的工作机制其实是分两部分的:
- 表结构文件(
.sql):由本地的mysqldump进程直接生成,所以会出现在你指定的本地目录里,这部分没问题。 - 数据文件(
.txt):mysqldump会让远程MySQL服务器执行SELECT INTO OUTFILE语句来生成,这个路径是相对于远程服务器的,不是本地的!所以你指定的本地路径/output/path/在远程服务器上根本不存在,自然就报Errcode: 2 - No such file or directory的错误了。
下面给你两种实用的解决方案,根据你的需求选:
方案1:先导出到远程服务器,再拉取到本地(补充细节版)
如果能访问远程服务器的文件系统,这是最贴合--tab原生行为的方法:
先在远程服务器上创建MySQL有权限写入的目录:
ssh remote_user@remote_db_ip "mkdir -p /remote/output/dir && chown mysql:mysql /remote/output/dir"(替换成你的远程用户名、IP和目标目录)
执行
mysqldump,指定远程的输出路径:mysqldump --host=remote_db_ip -u your_db_user -p --tab=/remote/output/dir your_target_database输入数据库密码后,远程服务器的指定目录会生成所有表的
.sql和.txt文件。用
scp把文件拉回本地:scp remote_user@remote_db_ip:/remote/output/dir/* /local/target/dir/
方案2:纯本地生成所有单个表文件(无需操作远程服务器)
如果不想碰远程服务器的文件系统,可以通过循环导出每个表的结构和数据来实现:
先获取目标数据库的所有表名,保存到临时文件:
mysql --host=remote_db_ip -u your_db_user -p -N -e "SHOW TABLES FROM your_target_database" > tables_list.txt-N参数用来去掉结果的表头,只保留表名。创建本地输出目录,然后循环处理每个表:
mkdir -p /local/target/dir while read table_name; do # 导出表结构 mysqldump --host=remote_db_ip -u your_db_user -p --no-data your_target_database $table_name > /local/target/dir/$table_name.sql # 导出表数据(和--tab生成的txt格式一致,制表符分隔、换行结尾) mysql --host=remote_db_ip -u your_db_user -p -B -e "SELECT * INTO OUTFILE '/dev/stdout' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' FROM your_target_database.$table_name" > /local/target/dir/$table_name.txt done < tables_list.txt-B参数确保输出用制表符分隔,/dev/stdout让MySQL把数据输出到标准输出,再重定向到本地文件,完美模拟--tab的txt格式。
核心原因复盘
再强调一下为什么--tab连远程时会出问题:SELECT INTO OUTFILE是MySQL服务器端执行的语句,它只能写入服务器本地的文件系统,而mysqldump的--tab参数在远程连接时,会把数据文件的生成任务交给远程服务器,所以你指定的路径必须是远程服务器上存在且MySQL有权限写入的路径,本地路径对远程服务器来说是无效的。
内容的提问来源于stack exchange,提问作者Myles
相关产品推荐
相关产品推荐

