MySQL分库分表单库分表和迁移数据(4th)

HH MySQLMySQL分库分表单库分表和迁移数据(4th)已关闭评论16,8304字数 3059阅读10分11秒阅读模式

前奏

因为在分表的时候我们需要知道我们分的是第几个表,所以我们先需要初始化我们的分表号

-- 创建一个系统信息表为了记录下当前最大的分表号
DROP TABLE system_setting;
CREATE TABLE system_setting(
  system_setting_id INT unsigned NOT NULL AUTO_INCREMENT COMMENT '系统设置表ID',
  name VARCHAR(45) NOT NULL COMMENT '系统设置项目名',
  value VARCHAR(45) NOT NULL COMMENT '系统设置值',
  PRIMARY KEY(system_setting_id)  
);
 
-- 初始化当前最大分表号
INSERT INTO system_setting VALUES(NULL, 'max_sharding_table_num', 1);
 
-- 指定需要有哪些表需要分,为了下面分表时进行锁表
INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'sell_order');
INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'buy_order');
INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'goods');
INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'order_goods');
 
-- 需要分表的表是通过什么字段来分表的
INSERT INTO system_setting VALUES(NULL, 'sharding_sell_order_by', 'user_guide_id');
INSERT INTO system_setting VALUES(NULL, 'sharding_buy_order_by', 'user_id');
INSERT INTO system_setting VALUES(NULL, 'sharding_goods_by', 'store_id');
INSERT INTO system_setting VALUES(NULL, 'sharding_order_goods_by', 'user_guide_id');
 
-- 普通用户需要分那张表
INSERT INTO system_setting VALUES(NULL, 'normal_user_sharding', 'buy_order');
-- 导购需要分的表
INSERT INTO system_setting VALUES(NULL, 'user_guide_sharding', 'buy_order');
INSERT INTO system_setting VALUES(NULL, 'user_guide_sharding', 'sell_order');
INSERT INTO system_setting VALUES(NULL, 'user_guide_sharding', 'order_goods');
-- 店主需要分哪些表
INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'buy_order');
INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'sell_order');
INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'order_goods');
INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'goods');

我们的目标

1、我们的目标是实现能手动指定创建多少张表,并且能手动指定哪些用户到哪些表中。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

2、最终能通过一定的算法,自动化这些分表迁移数据的工作。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

在这里我们来实现 '1' 手动指定, 以下可能比较枯燥都是代码了, 一般只要看主逻辑有一个思路,代码自己玩转它 ^_^文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

程序流程图

mysql文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

代码主逻辑展示

在附件中有完整的代码文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

if __name__=='__main__':
  # 设置默认的数据库链接参数
  db_config = {
    'user'    : 'root',
    'password': 'root',
    'host'    : '127.0.0.1',
    'port'    : 3306,
    'database': 'test'
  }
   
  sharding = ShardingTable()
  # 设置数据库配置
  sharding.set_db_config(db_config)
  # 初始化游标
  sharding.get_conn_cursor()
  # 提供需要分表的个数,创建分表
  sharding.create_tables(9)
  # 指定用户迁移数据到指定表
  sharding.move_data('username1', 2)
  sharding.move_data('username6', 6)
  sharding.move_data('username66', 9)

上面我们指定新分9个表,并且迁移 'username1-店主'、'username6-导购'、'username66-普通用户' 的数据到指定分表文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

完整的python代码:sharding_table.py   MySQL分库分表(4)-脚本文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

查看迁移后的数据

-- 查看迁移后的数据-购买订单表
SELECT * FROM buy_order_2 LIMIT 0, 1;
SELECT * FROM buy_order_6 LIMIT 0, 1;
SELECT * FROM buy_order_9 LIMIT 0, 1;
-- 查看迁移后的数据-商品表
SELECT * FROM goods_2 LIMIT 0, 1;
SELECT * FROM goods_6 LIMIT 0, 1;
SELECT * FROM goods_9 LIMIT 0, 1;
-- 查看迁移后的数据-出售订单表
SELECT * FROM sell_order_2 LIMIT 0, 1;
SELECT * FROM sell_order_6 LIMIT 0, 1;
SELECT * FROM sell_order_9 LIMIT 0, 1;
-- 查看迁移后的数据-订单商品表
SELECT * FROM order_goods_2 LIMIT 0, 1;
SELECT * FROM order_goods_6 LIMIT 0, 1;
SELECT * FROM order_goods_9 LIMIT 0, 1;
-- 查看用户数据分布在哪个分表 table_flag
SELECT * FROM user WHERE user_id IN(1, 6, 66);

若有疑问,请跟帖说明。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

 文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

感觉本文内容不错,读后有收获?文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

逛逛衣服店,鼓励作者写出更好文章。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/ 文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
HH
  • 本文由 发表于 22/02/2016 01:25:29
  • 转载请务必保留本文链接:https://www.ttlsa.com/mysql/mysql-distributed-database-and-table-shared-table-and-move/