执行mysqldump备份WordPress数据库时遇1102错误求助
备份WordPress数据库时出现数据库名称错误的解决办法
问题重现
尝试备份所有以wp_开头的WordPress数据库,执行了以下操作:
- 提取数据库名到变量:
databases=$(mysql -u root -p --vertical --skip-column-names -e "SHOW DATABASES LIKE 'wp_%'" | grep -i wp | tr '\n' ' ') echo $database # 预期输出类似 wp_1 wp_2 wp_3 ...
- 执行备份命令:
mysqldump -u root -p --add-drop-database --add-drop-table --lock-tables --add-locks --add-drop-trigger --disable-keys --databases $databases > wordpress_databases.sql
触发错误:
mysqldump: Got error: 1102: Incorrect database name 'wp_1 wp_2 wp_' when selecting the database
错误原因
- 变量名拼写错误:定义的变量是
databases(带s),但echo时用的是$database(不带s),这会导致你无法确认databases变量的实际内容,甚至可能因为变量未正确传递,让mysqldump把一堆字符串当成单个数据库名。 - 字符串拼接的解析问题:用
tr '\n' ' '把数据库名换成空格分隔的字符串后,bash在解析$databases时,若遇到特殊情况(比如数据库名含特殊字符),会把整个字符串当成一个参数传递给mysqldump,导致它认为这是一个数据库名,自然报错。
修复方案
方案一:用数组存储数据库名(最健壮)
数组能正确处理每个数据库名作为独立参数,避免解析错误:
# 用数组存储所有wp_开头的数据库名 databases=($(mysql -u root -p --skip-column-names -e "SHOW DATABASES LIKE 'wp_%'")) # 执行备份,数组展开确保每个数据库名是独立参数 mysqldump -u root -p --add-drop-database --add-drop-table --lock-tables --add-locks --add-drop-trigger --disable-keys --databases "${databases[@]}" > wordpress_databases.sql
方案二:直接在mysqldump中嵌套查询(更简洁)
跳过变量赋值,直接把数据库查询结果作为参数传递:
mysqldump -u root -p --add-drop-database --add-drop-table --lock-tables --add-locks --add-drop-trigger --disable-keys --databases $(mysql -u root -p --skip-column-names -e "SHOW DATABASES LIKE 'wp_%'") > wordpress_databases.sql
额外优化说明
- 去掉了
--vertical参数:SHOW DATABASES默认每行输出一个数据库名,--vertical会打乱输出格式,完全没必要。 - 去掉了
grep -i wp:LIKE 'wp_%'已经精准过滤出以wp_开头的数据库,重复过滤纯属多余。
内容的提问来源于stack exchange,提问作者kellymandem
相关产品推荐
相关产品推荐

