大数据表结构修改

随着业务的发展。某些业务表会达到很高的量级。这时候某些业务如果牵扯到修改数据结构,就不是简单的alter table 能搞定的事情了。

复制一个新表,表结构跟老表一摸一样

create table user_new like user;

修改表结构(这里以增加字段为例)

alter table user_new add column `status` tinyint(8) DEFAULT NULL;

同时交换两个表的表名(user,user_new)

rename table user to user_old,user_new to user;

注意:这时业务数据会写到复制的空表里面因为结构是一致的,所有新入库的数据ID是老表MAX(ID)+1自增不会和老表冲突,带ID复制旧数据也不会冲突。 拷贝数据从旧数据 最大的id 倒叙插入 就没问题了。

 拷贝数据

insert into user select * from user_old

如果数据量较大,可以使用条件语句,分批拷贝(这里以id为例,一般都以create_time为条件) 

insert into user_new (id, is_delete, type) select id, is_delete, type from user where id>100000

比对结果数据相同后,删除旧表(假设旧表最大ID=489521567)

SELECT count(*) from user_old limit 1;
SELECT count(*) from user where id<=489521567 limit 1; 

快速修改MySQL数据库名称

比如数据库名称old_db想改名为new_db,通过修改表名称,间接实现修改数据库名称

使用此方法实际上将所有表从一个数据库移动到另一个数据库,这实际上重命名了该数据库(MySQL没有单个语句的操作),移动后原始数据库继续存在,但是里面没有表。

create database new_db;
rename table old_db.tb to new_db.tb;
drop database old_db;

如何使用shell脚本来批量修改表名:

  • 当库下表比较多的时候,用上面方法纯手动也不现实,好在linux下可以用shell脚本来批处理。
  • 附上一个shell脚本批量修改表名称。
#!/bin/bash
mysql -uroot -p123456 -e 'create database if not exists new_db;'
list_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='old_db'")

for table in $list_table
do
    mysql -uroot -p123456 -e "rename table old_db.$table to new_db.$table"
done

mysql登陆命令行参数

  • -e, --execute=name # 执行mysql的sql语句
  • -N, --skip-column-names # 不显示列信息
  • -s, --silent # 一行一行输出,中间有tab分隔

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐