我创建了一个shell脚本来自动化从主机到主机的数据库迁移,它将我的Multi WordPress站点表提取到单独的sql
文件中,这样我就可以决定每次迁移哪个站点。
所以在我的shell脚本中,我有以下代码:
schema="internet-safe"
PROJECT_FOLDER_NAME="internet-safe"
vagrant_export_folder="/var/www/projects/${PROJECT_FOLDER_NAME}/database/tmp"
query="mysql -uroot -proot -e \"SELECT blog_id AS ID, path AS Slug FROM ${schema}.wp_blogs "
query="$query INTO OUTFILE '$vagrant_export_folder/blogs.csv' "
query="$query FIELDS TERMINATED BY ',' "
query="$query ENCLOSED BY '\\\"' "
query="$query LINES TERMINATED BY '\n' \" > /dev/null"
vagrant ssh --command "cd $vagrant_export_folder && $query"
但是通过执行此脚本,我收到以下错误:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-safe.wp_blogs INTO OUTFILE '/var/www/projects/internet-safe/database/tmp/blogs' at line 1
关闭127.0.0.1的连接。
问题是架构名称internet-safe
中的破折号。有没有办法纠正这个问题?
我知道有一个选项,只是重命名架构,但不幸的是我在xUbuntu上运行不稳定的流浪汉,它已经多次破坏我的数据库,而我尝试在我的数据库中配置修改。
我也尝试了以下组合,但收到如下错误消息:
`${schema}`.`wp_blogs`
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTO OUTFILE '/var/www/projects/internet-safe/database/tmp/blogs.csv' FIELDS TE' at line 1
`${schema}`.wp_blogs
ERROR 1046 (3D000) at line 1: No database selected
`${schema}.wp_blogs`
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTO OUTFILE '/var/www/projects/internet-safe/database/tmp/blogs.csv' FIELDS TE' at line 1
答案 0 :(得分:1)
最佳选择当然是简单地重命名数据库。
通常,当架构/表/列名称中出现特殊字符时,您可以使用反引号修复此问题。因为你试图运行一个shell脚本,不幸的是它会将反引号中的任何内容解释为命令。
在MySQL中,您可以设置sql_mode“ANSI_QUOTES”。使用
以管理员/ root(在MySQL中)执行此操作mysql> SET GLOBAL sql_mode="ANSI_QUOTES";
如果您已经使用
设置了任何模式,请先检查mysql> SHOW VARIABLES LIKE 'sql_mode';
如果已经设置了模式,请在SET GLOBAL sql_mode
语句中包含这些模式(由,
分隔)。
您也可以在my.cnf
文件中设置此选项,以便每次启动MySQL服务器时都应用此模式。
效果是,"
也被允许作为标识符引用字符。但请注意,您不要在查询中使用"
来指定任何文本,而是使用单引号。