首页域名资讯 正文

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

2025-01-01 1 0条评论

前奏

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 — 创建一个系统信息表为了记录下当前最大的分表号 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、我们的目标是实现能手动指定创建多少张表,并且能手动指定哪些用户到哪些表中。

2、最终能通过一定的算法,自动化这些分表迁移数据的工作。

在这里我们来实现 ‘1’ 手动指定, 以下可能比较枯燥都是代码了, 一般只要看主逻辑有一个思路,代码自己玩转它 ^_^

程序流程图

代码主逻辑展示

在附件中有完整的代码

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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-普通用户’ 的数据到指定分表

完整的python代码:sharding_table.py   MySQL分库分表(4)-脚本

查看迁移后的数据

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 — 查看迁移后的数据-购买订单表 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);

 

 

 

文章转载来自:trustauth.cn

文章版权及转载声明

本文作者:亿网 网址:https://edns.com/ask/post/150737.html 发布于 2025-01-01
文章转载或复制请以超链接形式并注明出处。