全庫特定字符串修改

需求:網站更名

原名: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函數可以做到 

爲確保安全請將生產庫備份在測試庫上執行 然後經過測試線上無誤 再遷移至生產庫

思考爲什麼不直接在寫存儲過程的時候就直接是替換呢 線上數據庫 數據重如泰山 而且全表跟新會造成很大的資源問題因此確定

到過濾掉沒有的之後更新 如果數量較多可以一條一條語句更新


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章