全库特定字符串修改

需求:网站更名

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

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

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

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

时间: 2024-10-14 14:15:32

全库特定字符串修改的相关文章

[Oracle]根据字段值全库搜索相关数据表和字段

这个需求比较冷门,但对于在某些特定的情况下,还是会有这样的需要的.好在Oracle实现还比较方便,用存储过程则轻松实现. 查询字符串: create or replace procedure search_string(pString in varchar) as cursor all_tab_cursor is select a.owner, a.table_name, b.column_name from dba_tables a, dba_tab_columns b, dba_object

sqlserver 全库查询 带架构

网上现有的全库查询,无法识别自定义架构的数据库结构: declare @str nvarchar(10) declare @tablename varchar(50) declare @colname varchar(50) declare @counts int declare @sql nvarchar(2000)--以上定义变量 declare cur1 cursor for select a.name tablename,B.name colname from sys.objects a

Percona Xtrabackup备份mysql全库及指定数据库(完整备份与增量备份)

原文地址:http://www.tuicool.com/articles/RZRnq2 Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份 同样需要加表锁).XtraBackup支持所有的Percona Server.MySQL.MariaDB和Drizzle. XtraBackup优势 : 1.无需停止数据库进行InnoDB热备 2.增量备份MySQL 3.流

【开源框架】SqlSugarRepository 全库ORM 正式发布

SqlSugarRepository.dll 全库开发框架支持 四种数据库:SqlServer. MySql .Oracle和Sqlite. SqlSugarRepository是为全库开发而生的ORM框架,能够做到多种数据库之间的无间隙切换,在这一年多的时间里,园友提出的各种需求我都已经切切实实的去做了,做到了能力范围内的最好,一个不错的里程碑.同时也对未来有了更明确的规划,这只是开源的开始,Sugar ORM 还会有更多惊喜. 基于SqlSugar的开源CMS(佰签软件出品)和SqlSuga

使用network管理DD恢复全库操作步骤

使用network管理DD恢复全库操作步骤基本信息:系统平台:RHEL 5.4_86_64database版本:11.2.0.2.0-64bit1.检查目标主机是否安装networker客户端. ps -ef | grep nsr 无软件需要安装软件networker客户端. 2.检查各个主机中/etc/hosts文件对相应主机进行解析. networker备份服务器 主机名 源服务器DB 主机名 目标服务器DB 主机名 三台主机必须相互解析. notes: 在legato networker配

rman全库恢复到不同主机,不同实例名,不同目录下

一.配置目标主机的ip.hostname及与源端主机的连通性 1.配置目标主机IP 使用图形界面配置IP: administration----network---修改IP(指定静态IP) deactivate网卡---activate网卡(重启网卡配置才能生效)或者使用root用户执行:service network restart 重启网卡 2.配置主机名 root用户执行:hostname hostNameValue vi  /etc/sysconfig/network 修改:HOSTNA

Percona Xtrabackup备份mysql全库及指定数据库(转)

原文:http://www.drupal001.com/2014/02/percona-xtrabackup-mysql/ Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁).XtraBackup支持所有的Percona Server.MySQL.MariaDB和Drizzle. XtraBackup优势 : 1.无需停止数据库进行InnoDB热

ORACLE 11G在同一台linux服务器从实例1全库导入到实例2上

前期导出命令: [root@powerlong4 ~]# su - oracle [oracle@powerlong4 ~]$ export ORACLE_SID=pt1; [oracle@powerlong4 ~]$ expdp \'sys/systestpd as sysdba\' DIRECTORY=dir_dump_t3 FULL=YES DUMPFILE=expdpfull_pd_20150529_02.dmp ...... 1,开始导入 先在实例2上建立管道目录: [[email p

再谈MySQL全库备份

再谈MySQL全库备份 简介 Part1:写在最前 在很早之前,我写过一个MySQL生产库全库备份脚本,今天有同事问我是不是要再加一个-R参数来备份存储过程,理由的话是由于mysqldump --help中 关于存储过程的默认备份是false. routines                          FALSE MySQL生产库全库备份脚本 http://suifu.blog.51cto.com/9167728/1758022 实战 Part1:写在最前 我备份一般就三个参数 --s