上面提到的两个问题的解决办法都是在导入之前预先编辑修改下导出的SQL文件,先将存储过程、函数和例程的所有者根据业务规则进行统一整理,然后再将命令行的结束符统一替换为"$$",无误后再进行导入操作。
特别需要注意的是进行字符替换时一定要基于只包含数据结构的导出文件,因为应用数据中极有可能会存在相应的分隔符,特别是在linux操作系统下进行字符转码后。
Linux下批量替换字符串的脚本如下所示:
sed -i 's/;;/$$/g' xxx_structure_20110609.dmp && sed -i 's/`user1`/`user3`/g' && sed -i 's/`user2`/`user3`/g'
&&表示SHELL命令顺序执行,这样可以节省盯着屏幕等待的时间,但是需要注意的是前一个执行失败的话后一个将不再执行。
五.一点困惑:
利用上面的解决办法批量替换字符串后,再次进行数据导入就可以成功导入数据,数据核查也没有问题。当导出的数据库存在多个例程时例程虽然也能成功导入,但会报告下面错误:
ERROR at line 2144: DELIMITER must be followed by a 'delimiter' character or string
ERROR at line 2162: DELIMITER must be followed by a 'delimiter' character or string
ERROR at line 2180: DELIMITER must be followed by a 'delimiter' character or string
分析SQL数据导出文件,个人猜测可能是由于多次使用了同样的DELIMITER指令进行命令行结束符的重定义所致,具体原因不是很清楚,也没有找到办法如何避免这个错误。