sed 删除 SQL 文件中 CREATE DATABASE 和 USE 语句需用 /^CREATE DATABASE/d; /^USE /d 精准匹配行首,避免误删表名中的库名;对库前缀替换应使用 sed -E "s/[^]+\.([^]+)/\1/g" 仅处理语法结构;导入前用 grep 检查残留语句;更优方案是直接 mysql -D targetdb 跳过库声明。
用
删除 SQL 文件里的
和
语句
直接删掉这些语句,才能让 sql 文件在目标库中安全导入,否则会报错或创建错库。重点不是“替换”,而是“跳过执行”——
在这里干的是预处理裁剪的活。
常见错误是只删
却漏了
,结果导入时仍报
;或者用错地址匹配,把表结构里的库名(如
)也误删了。
用
最简够用,注意行首锚定
,避免误伤
如果 SQL 文件带注释或空格缩进,改用
MySQL 8.0+ 导出默认带
这类条件注释,它们不干扰,不用动
保留库内对象但强制指定目标库名:用
替换
中的库前缀
当源 SQL 里所有表都写成
,而你只想导入到当前已选中的库(比如
),就得把库名前缀干掉,不然会报
(因为目标库里没这个库)。
这不是全局替换字符串,而是精准替换语法结构:只动
、
等语句开头的库名引用,不动字段名或数据内容里的反引号片段。
安全做法:
—— 只匹配「反引号库名.反引号表名」模式
更稳一点可加行限制:
别用
这种粗暴方式,容易把
这类字段名也砍掉
导入前检查是否还有残留库操作:用
快速扫描
预处理完别急着导入,先确认文件里真没漏网的
或
。人眼扫几百行容易漏,命令一跑就清楚。
—— 行号+匹配内容,方便定位
查还有多少带库前缀的表引用,判断是否需要二次清理
如果输出非空,说明
规则没覆盖全,比如有换行、大小写混用(
小写)、或用了双引号而非反引号
真正省事的方式:绕过
,用 MySQL 客户端参数控制
如果你只是想“忽略 SQL 文件里的库声明,只执行表和数据操作”,其实根本不用改文件——
命令本身就能跳过库级语句。
用
指定默认库),此时所有未显式带库名的操作都会落到
,而
和
会被客户端静默忽略(不会报错,也不执行)
但注意:这招对
依然无效,它还是会去查
,所以库前缀仍需清理
若导出时用了
等,导入前最好也核对下目标库权限,否则可能卡在触发器创建失败上
最麻烦的其实是混合了多库对象又没做逻辑分离的 SQL 文件——这种没法靠一条
搞定,得先拆分再处理。别省那几分钟,先
粗筛一下结构再说。
sedCREATE DATABASEUSEsedUSECREATE DATABASEERROR 1007 (HY000): Can't create database 'xxx'; database exists`mydb`.`users`sed '/^CREATE DATABASE/d; /^USE /d'^sed '/^[[:space:]]*\(CREATE DATABASE\|USE\)/d'/*!40101 SET @OLD_SQL_MODE=... */sedCREATE TABLECREATE TABLE `sourcedb`.`users`targetdbERROR 1146 (42S02): Table 'sourcedb.users' doesn't existCREATE TABLEINSERT INTOsed -E "s/`[^`]+`\.`([^`]+)`/`\1`/g"sed -E "/^(CREATE TABLE|INSERT INTO|ALTER TABLE|DROP TABLE)/ s/`[^`]+`\.`([^`]+)`/`\1`/g"sed 's/sourcedb\.//g'user_source_db_idgrepCREATE DATABASEUSEgrep -n "^\(CREATE DATABASE\|USE\|DROP DATABASE\)" cleaned.sqlgrep -c "`[^`]*`\." cleaned.sqlsedusesedmysqlmysql -D targetdb (-DtargetdbCREATE DATABASEUSECREATE TABLE `sourcedb`.`t`sourcedb--skip-triggers --skip-routinessedawk '/^-- Current Database:/ {db=$NF} /^CREATE TABLE/ {print db, $0}'