需求:網站更名
改名: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函數可以做到
爲確保安全請將生產庫備份在測試庫上執行 然後經過測試線上無誤 再遷移至生產庫
思考爲什麼不直接在寫存儲過程的時候就直接是替換呢 線上數據庫 數據重如泰山 而且全表跟新會造成很大的資源問題因此確定
到過濾掉沒有的之後更新 如果數量較多可以一條一條語句更新