首页 > 代码库 > 全库特定字符串修改

全库特定字符串修改

需求:网站更名

原名:www.zhangsan.com

改名: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函数可以做到 

为确保安全请将生产库备份在测试库上执行 然后经过测试线上无误 再迁移至生产库

思考为什么不直接在写存储过程的时候就直接是替换呢 线上数据库 数据重如泰山 而且全表跟新会造成很大的资源问题因此确定

到过滤掉没有的之后更新 如果数量较多可以一条一条语句更新


本文出自 “笑嘻嘻啊” 博客,转载请与作者联系!

全库特定字符串修改