需求:网站更名
改名:www.lisi.cn
需要将数据库里面所有表里面含有www.zhansan.com改成 www.lisi.cn
思路:
思路通过字典表information_schema.table得知整个数据库的所有表和字段
将每列和表匹配查询到含有www.zhangsan.com的字段,查询到的改成www.lisi.cn即可
步骤:
第一步:写一个存储过程
DELIMITER $$ CREATE PROCEDURE `test`.`filter_data1`() BEGIN DECLARE v_table_schema VARCHAR(255); DECLARE v_table_name VARCHAR(255); DECLARE v_column_name VARCHAR(255); DECLARE v_content VARCHAR(1024); DECLARE done INT DEFAULT FALSE; DECLARE cur_table_col CURSOR FOR SELECT table_schema,table_name,column_name FROM information_schema.COLUMNS where TABLE_SCHEMA NOT IN ( ‘mysql‘,‘information_schema‘,‘performance_schema‘,‘test2‘ ) ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur_table_col; read_loop:LOOP FETCH cur_table_col INTO v_table_schema,v_table_name,v_column_name; IF done THEN LEAVE read_loop; END IF; SELECT CONCAT(‘select * from ‘,v_table_schema,‘.‘,v_table_name,‘ where ‘,v_column_name,‘ like ‘‘%mxj%‘‘ ;‘) INTO v_content; INSERT INTO content (content) VALUES (v_content); END LOOP; CLOSE cur_table_col; END$$ DELIMITER ;
CREATE TABLE content(content VARCHAR(300)); call `test`.`filter_data11`()
call完之后再test里content表里面记录了详细语句;
第二步:
执行content表里面存的所有查询语句,有为空的,有能得到查询记录www.zhangsan.com的,将得到结果的全部替换成www.lisi.cn
当然我们不能手动一个一个去判断哪一条语句有结果那一条没有需要一个循环的判断脚本
mkdir /opt/k/ mkdir /opt/l cd /opt/l
将之前存储过程得出的结果复制到该文件里面来,即是将contetnt表里面的所有查询语句存到文件/opt/l/sqlfile.txt中
vim tiaoshi.sh #!/bin/bash SQLFILE=/opt/l/sqlfile.txt RESULTFILE=/tmp/result.txt TMPFILE=/tmp/tmpfile TMP=0 > $RESULTFILE while read line do echo $line echo ‘‘$line‘‘ |mysql -p123 > $TMPFILE if [ -s $TMPFILE ] then echo $line >> $RESULTFILE TMP=$(($TMP +1)) fi done < /opt/l/sqlfile.txt
sh ../l/tiaoshi.sh 必须这样执行 必须在一个空文件夹下面通过路径找到去执行 否则的话 会把目录下的其他文件名字带入
/tmp/tmpfile是结果存储的地方
/tmp/result.txt是有结果的sql语句 通过该语句就可以判断出那些表有www.zhangsan.com字样
注意:sqlfile.txt 该文件 里面关于前面写存储过程的得出结果那张表(test.content)就不用检查了
还有类似一下语句都会报错
select * from nihao.a where ‘key‘ like ‘%www.zhangsan.com%‘ ;
select * from nihao.a where ‘to‘ like ‘%www.zhangsan.com%‘ ;
select * from nihao.a where ‘from‘ like ‘%www.zhangsan.com%‘ ;
select * from nihao.c where ‘default‘ like ‘%www.zhangsan.com%‘ ;
select * from nihao.c where ‘desc‘ like ‘%www.zhangsan.com%‘ ;
这因为在where 后面的条件列是有特殊含义的 应该加上单引号
第三步:
确定表更改
通过update
UPDATE tb1 SET f1=REPLACE(f1, ‘www.zhangsan.com‘, ‘www.lisi.cn‘);
Tb1想修改的表名 f1想修改的列名
www.zhangsan.com为想修改的字符
www.lisi.cn为改成什么字符
使用replace函数可以做到
为确保安全请将生产库备份在测试库上执行 然后经过测试线上无误 再迁移至生产库
思考为什么不直接在写存储过程的时候就直接是替换呢 线上数据库 数据重如泰山 而且全表跟新会造成很大的资源问题因此确定
到过滤掉没有的之后更新 如果数量较多可以一条一条语句更新