本文使用shell实现一个小工具,可以整理阿里云RDS导出数据库结构的zip文件,整理为可直接使用的sql文件。
阿里云RDS导出的数据库结构sql需要整理的地方
1.解压后sql文件名称缺少数据库名称标识
阿里云RDS导出的数据库结构sql,会压缩为一个zip文件,解压后的sql文件名称没有带上数据库名。
例如
数据库名称是test_user
导出后的zip文件名称: test_user_1616950_all_sql.zip
解压后的sql文件名称: 1616950_all.sql
如果同时存在多个数据库导出文件,这样比较难去区分,因此需要对解压后的文件重命名,带上数据库名称。
2.附带不需要用到的设定数据
因为只导出结构,并不需要数据,因此我们并不需要获取之前数据库表的AUTO_INCREMENT设定,对于类似这种的设定,也需要去掉。
3.解压后的sql文件为utf8 bom
如果我们执行这个sql创建数据表是使用例如php代码读取后执行,sql文件带utf8 bom会导致执行出错,因此需要把sql文件的utf8 bom头去掉。
整理步骤
1.解压文件
2.解压后文件按数据库名重命名
3.删除AUTO_INCREMENT及ROW_FORMAT设定参数
4.去掉文件的utf8 bom头
代码如下
#!/bin/bash
# 解压阿里云导出的数据库zip文件,执行重命名,转utf8 not bom编码,删除无用语句等处理
#
# Date: 2017-12-18
# Author: fdipzone
# Ver: 1.0
#
# 保存解压后重命名的sql文件
sqlfile=()
# 遍历当前目录下所有zip文件
for file in $(find . -name "*.zip" -type f) ; do
# 定义解压后重命名的文件名
tmp_sqlfile=$(echo $file|sed 's/_[0-9]*_all_sql.zip/.sql/')
tmp_sqlfile=${tmp_sqlfile:2}
# 保存到数组
sqlfile+=($tmp_sqlfile)
# 执行解压
unzip_file=$(unzip $file|grep 'inflating'|awk -F ' ' '{print $2}')
# 重命名
$(mv $unzip_file $tmp_sqlfile)
done
# 遍历所有sql文件,删除无用语句,且转为utf8 not bom编码
for f in ${sqlfile[*]}; do
# 删除ROW_FORMAT=XXX
$(sed -i 's/ROW_FORMAT=[A-Z]*//g' $f)
# 删除AUTO_INCREMENT=XXX
$(sed -i 's/AUTO_INCREMENT=[0-9]*//g' $f)
# 删除utf8 bom
$(sed -i 's/^\xEF\xBB\xBF//g' $f)
done
exit 0