MySQL实例全局遍历替换特征字符串的自动化实现

Hazel
Hazel
发布时间:2026-10-15 | 4人浏览过
原创

本文详解利用脚本自动化完成MySQL实例内所有字段的特征字符串(如旧域名)替换操作。核心流程包括筛选相关库表字段、人工抽样验证、自动生成UPDATE语句及执行更新,确保数据迁移或域名切换的安全与准确。

目标与准备

当需要将一个MySQL实例(例如 10.10.10.1:3306)中所有包含特定特征字符串(如 .letssing.net)的字段数据统一替换为新值(如 .kaixinvv.com)时,手动逐表修改既不现实又易出错。本方案旨在通过脚本自动化完成“发现-验证-替换”的全过程。

第1步:确定替换规则

明确待替换的源字符串和目标字符串,以及匹配的条件。通常涉及URL或域名,需同时考虑 HTTP 和 HTTPS 协议。

  • 替换规则:将 .letssing.net/ 替换为 .kaixinvv.com/。
  • 匹配条件:字段内容中包含 %http://%.letssing.net/% 或 %https://%.letssing.net/%。

第2步:找出实例中所有符合特征的库表字段

为了避免在大表或系统表中执行耗时且无意义的查询,需要精确筛选出可能包含该特征的字符类型字段。

子步骤:生成筛选查询SQL

通过查询 information_schema.columns 和 information_schema.tables,筛选出满足以下条件的字段:

  • 数据类型为字符串类(varchar, text, char 等)。
  • 排除系统库(mysql, information_schema 等)。
  • 排除超大表(限制大小小于 1GB)。
  • 排除日志类或幂等性特殊用途表(避免命中 *log* 等命名)。
$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

执行上述脚本,将生成的 SQL 语句保存至 query.sql。

子步骤:执行查询并导出结果

运行生成的 query.sql,将所有存在潜在匹配的库、表、列名导出到文本文件中,供后续人工确认使用。

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

结果示例:

db1    table1    column1
db1    table1    column2
db2    table2    column1

第3步:人工采样确认

在批量更新前,必须验证这些字段是否真的包含目标字符串,以及数据的准确性。此步骤防止误更新无关字段。

子步骤:导入字段列表

创建一个临时表用于存储上一步发现的字段信息,便于关联查询。

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

针对每个待查字段,查询最多 5 条包含特征的数据,以便人工核对。

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

子步骤:执行抽样并查看结果

mysql -uroot -p123456 -h10.10.10.1 -P3306 < query_domain.sql > 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/ksc/90/16/90461116-0.ksc

若抽样结果符合预期,则可进入下一步更新。

第4步:生成并执行更新SQL

确认无误后,利用 MySQL 内置的 REPLACE() 函数生成批量更新语句。

子步骤:生成更新语句

基于临时表 t1,拼接生成 UPDATE 语句,仅处理确实包含特征字符串的记录(WHERE LIKE ...),以提高效率并确保安全。

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

子步骤:执行更新

最后,将生成的 update.sql 导入目标数据库执行。

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

操作完成后,建议随机抽检部分表和数据,确认替换效果符合预期。

总结

本文提供了一套完整的MySQL全局替换特征字符串的方案,通过自动化脚本实现了从字段发现、人工验证到批量更新的全流程。该方法不仅提高了数据处理的效率,还通过前置的人工采样环节有效降低了数据变更的风险。以上就是MySQL全局遍历替换特征字符串的实现方法的详细内容,更多关于MySQL数据迁移与安全替换的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表