项目线上服务器用的数据库是腾讯云的mysql数据库,每次更新服务器数据库脚本的流程,都是将测试服已经验证OK的脚本用heidisql工具导出来然后转到正式服环境执行,前期需要更新的数据库少,在heidisql工具里手动执行下,还OK,等到中后期,需要更新的数据库有20+,50+,100+。。。。哪效率就直线下降。所以就改成了用mysql的source命令执行,格式大致如下:
mysql -h $hostname -P$port -u$user -p$pwd $dbname --default-character-set=utf8 -e "source ${sqlfile}"
简单写的shell脚本大概长这样:
#!/bin/bash
beginserver=$1 # 参数1 起始服务器ID
endserver=$2 # 参数2 结束服务器ID
sqlfile=$3 # 参数3 执行SQL文件名
hostname=111.111.111.111
user=test
port=3306
pwd=test
for((i=$beginserver;i<=$endserver;i++))
do
dbname=database${i}
mysql -h $hostname -P$port -u$user -p$pwd $dbname --default-character-set=utf8 -e "source ${sqlfile}"
echo $dbname is updated;
done
执行数据快了N个数量级,而且简单方便。
周一日常更新,然后开心的点起脚本自动更新,突然屏幕刷屏的出现错误日志:
ERROR 1064 (42000) at line 138 in file: '20200612.sql': 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 'DELIMITER //CREATE DEFINER=`root`@`%` PROCEDURE `p_xxxxx_log_upd`(
' at line 1
ERROR 1064 (42000) at line 453 in file: '20200612.sql': 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 'END//
DELIMITER ;
DELIMITER //CREATE DEFINER=`root`@`%` PROCEDURE `p_tttt' at line 1
ERROR 1064 (42000) at line 463 in file: '20200612.sql': 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 'END//
DELIMITER ;
DELIMITER //CREATE DEFINER=`root`@`%` PROCEDURE `p_aaaa' at line 1
我靠,平时执行得好好流程,怎么会,突然报错,赶紧CTR+C终止执行,很好,终止了循环中得某一个库执行,下一个还是继续执行着。尼玛,一次CTR+C不行,我就来N次,CTR+C.......,我靠,不对,这样出了问题,一会更难排查,赶紧停止了正在抽筋的左手。。。
跑完了整个脚本,看了下日志,大概有5,6个库跳过了执行。看了下报错信息,是有语法错误,打开sql脚本看了半天,没发现有啥问题啊。赶紧复制到heidisql执行下,居然安静的跑完,没报错!
啥情况?语法没问题呀,难道格式不对? set ff?下,是dos的,赶紧改咯,再执行下脚本,报错依旧,尼玛。。。
回头再看看报错的位置,冷静分析了下,都是再DELIMITER;附近出错的,附近都有换行符。换行符?回顾下自己sql脚本的流程,貌似有些部分是多个功能分开开发,最后合并再一起的,然后中间习惯性的会敲下换行,便于区分和查看。难道是换行时用的中文输入法导致的?赶紧替换掉换行符再来一次。居然过了,没报错!
搞了半天,自己坑了自己。不过为啥heidisql可以正常执行呢,想必时heidisql自己做了转行吧,这波骚操作,不得不服,肯定也是遇到过我这个问题。
重新刷新脚本,备份,更新流程,增加提示。