大数据修改 表结构 数据库名称

大数据表结构修改

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

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

create table user_new like user;

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

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

同时交换两个表的表名

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分隔

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值