mysql分表后 迁移数据_MySQL分库分表单库分表和迁移数据(4th)

前奏

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

-- 创建一个系统信息表为了记录下当前最大的分表号

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

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' 手动指定, 以下可能比较枯燥都是代码了, 一般只要看主逻辑有一个思路,代码自己玩转它 ^_^

程序流程图

05c0efab8adfd6b7d9901ddeb77f798c.png

代码主逻辑展示

在附件中有完整的代码

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)

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-普通用户' 的数据到指定分表

查看迁移后的数据

-- 查看迁移后的数据-购买订单表

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);

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);

若有疑问,请跟帖说明。

感觉本文内容不错,读后有收获?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值