首頁 > 軟體

MySQL全域性遍歷替換特徵字串的實現方法

2023-03-25 06:02:40

需求:將一個MySQL範例(如10.10.10.1:3306)範圍內所有欄位資料中的 .letssing.net 替換為 .kaixinvv.com。

實現:

1. 確定替換規則

replace .letssing.net/ -> .kaixinvv.com/  where column like (%http://%.letssing.net/% or %https://%.letssing.net/%)

2. 找出範例中所有符合特徵的庫表欄位

(1)生成查詢SQL語句

$cat find_db_table_column.sh
mysql -uroot -p123456 -h10.10.10.1 -P3306 -e "
select concat('select ','''',t1.TABLE_SCHEMA, '''',', ','''',t1.TABLE_NAME, '''',', ', '''',t1.COLUMN_NAME,'''',' 
                 from ', t1.TABLE_SCHEMA,'.',t1.TABLE_NAME,' where `',t1.COLUMN_NAME,'` like '%://%.letssing.net/%' limit 1;') 
  from information_schema.columns t1, information_schema.tables t2 
 where t1.DATA_TYPE in ('varchar','longtext','text','mediumtext','char') 
   and t1.TABLE_SCHEMA not in ('information_schema','mysql','performance_schema','sys') 
   and (t2.data_length+t2.index_length)/1024/1024/1024 < 1 
   and t2.table_name not like '%log%' and t2.table_name not like '%idempotent%' 
   and t1.table_schema= t2.table_schema 
   and t1.table_name= t2.table_name 
 order by t1.TABLE_SCHEMA, t1.TABLE_name, t1.column_name;" -N > query.sql

說明: 

  • mysql命令列執行查詢,將查詢結果輸出到檔案,-N引數用於去掉表頭。
  • 通過查詢資料字典檢視 information_schema.columns 和 information_schema.tables 生成查詢所有包含特徵字串的庫表欄位的SQL語句。查詢條件為:只查詢字串型別的欄位;不查詢系統庫表;只查詢1G以下的小表;不查詢某些特殊用途(紀錄檔、冪等性)的超大表。

(2)執行查詢並生成結果檔案

mysql -uroot -p123456 -h10.10.10.1 -P3306 -N < query.sql > result.txt

result.txt檔案內容範例:
db1    table1    column1
db1    table1    column2
db2    table2    column1
db2    table2    column2

3. 對上一步每個庫表欄位,查詢n條特徵資料,用以人工取樣確認

(1)匯入庫表欄位資料

mysql -uwxy -p -h127.0.0.1 -p123456 -P3306 --local-infile -Ddomain -e "
truncate table t1;
load data local infile '/home/mysql/domain_name/rule/result.txt' into table t1(dbname,tablename,columnname);"

說明:將前一步生成的結果檔案匯入一個表中,用於下一步生成查詢SQL語句。

(2)生成查詢資料的SQL語句

mysql -uwxy -p -h127.0.0.1 -p123456 -P3306 -Ddomain -e "
select concat('select ',instance,',''',dbname,''',''',tablename,''',`',columnname,'` from ',dbname,'.',tablename, ' where `',columnname,'` like '%://%.letssing.net/%' limit 5;') from t1 order by instance,dbname,tablename;" -N > query_domain.sql

說明:這裡對於每個符合條件的庫表欄位,查詢出5條資料用於人工確認。

(3)執行查詢並生成結果檔案

mysql -uroot -p123456 -h10.10.10.1 -P3306 < query_domain.sql > result_domain.txt

result_domain.txt檔案內容範例:
db1    table1    column1
db1    table1    http://txcdn-song-mvbox-cn.letssing.net/mka/16/90461116-0.mka
db1    table1    http://txcdn-song-mvbox-cn.letssing.net/mka/16/90461116-0.mka
db1    table1    column2
db1    table1    http://txcdn-song-mvbox-cn.letssing.net/ksc/90/16/90461116-0.ksc
db1    table1    http://txcdn-song-mvbox-cn.letssing.net/ksc/90/16/90461116-0.ksc
db2    table2    column1
db2    table2    http://txcdn-song-mvbox-cn.letssing.net/mka/16/90461116-0.mka
db2    table2    http://txcdn-song-mvbox-cn.letssing.net/mka/16/90461116-0.mka
db2    table2    column2
db2    table2    http://txcdn-song-mvbox-cn.letssing.net/ksc/90/16/90461116-0.ksc
db2    table1    http://txcdn-song-mvbox-cn.letssing.net/ksc/90/16/90461116-0.ksc

4. 更新特徵域名資料

(1)生成字串替換的更新SQL語句

mysql -uwxy -p -h127.0.0.1 -p123456 -P3306 --local-infile -Ddomain -e "
select concat('update ',dbname,'.',tablename,' set `',columnname,'` = ','replace(`',columnname,'`,',''.letssing.net/','.kaixinvv.com/')',
' where `',columnname,'` like '%http://%.letssing.net/%' or `', columnname,'` like '%https://%.letssing.net/%';')
  from t1 where instance = 1 order by instance,dbname,tablename;" -N > update.sql

(2)執行更新

mysql -uroot -p123456 -h10.10.10.1 -P3306 < update.sql

到此這篇關於MySQL全域性遍歷替換特徵字串的實現方法的文章就介紹到這了,更多相關MySQL全域性遍歷替換特徵字串內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com