MySQL分库分表python实现分库(7th)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

理清思路

现在我们分为两大个步骤:

1、创建分库,并在分库中创建分表。

2、能指定用户的数据到特定的库和表。

 

现在我们有两个数据库了:

1、test库:里面存放了公共访问的数据表,因此在python我们需要有一个公共数据源。

2、test_1分库:里面存放的是需要分表的表和数据,因此我们需要一个用户原数据所在的数据源。

3、test_n分库:此库是用户的数据需要迁移到其他库的库,因此我们需要一个数据迁移的目录库数据源。

     


               mysql


主执行过程

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
36
37
38
39
40
if  __name__ = = '__main__' :
   # 设置默认的数据库链接参数
   db_config_common  =  {
     'user'     'root' ,
     'password' 'root' ,
     'host'     '127.0.0.1' ,
     'port'     3306 ,
     'database' 'test'
   }
   # 配置用户数据所在数据库源
   db_config_from  =  {
     'user'     'root' ,
     'password' 'root' ,
     'host'     '127.0.0.1' ,
     'port'     3306 ,
     'database' 'test_1'
   }
   # 配置用户数据迁移目标数据目录
   db_config_from  =  {
     'user'     'root' ,
     'password' 'root' ,
     'host'     '127.0.0.1' ,
     'port'     3306 ,
   }
    
   sharding  =  ShardingDatabase()
   # 设置公共数据库配置
   sharding.get_conn_cursor(db_config_common,  'common' )
   # 设置用户原数据数据库配置
   sharding.get_conn_cursor(db_config_from,  'from' )
   # 设置用户目标数据库配置
   sharding.get_conn_cursor(db_config_to,  'to' )
  
   # 创建分库
   db_config_to.pop( 'database' )
   sharding.create_db(db_config_to)
  
   # 向分库中创建分表
   max_num  =  sharding.get_max_sharding_table_num()
   sharding.create_tables(begin  =  1 , offset  =  max_num, force = True )

执行分库程序

1
2
python sharding_database.py
python sharding_database.py

执行后结果

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
SHOW DATABASES;
+ --------------------+
Database            |
+ --------------------+
| test               |
| test_1             |
| test_2             |
| test_3             |
+ --------------------+
SELECT  FROM  test.system_setting;
+ -------------------+---------------------------+-----------------------------------------------------------------------------------------------+
| system_setting_id |  name                       | value                                                                                         |
+ -------------------+---------------------------+-----------------------------------------------------------------------------------------------+
|                18 | max_sharding_database_num | 3                                                                                             |
|                19 | sharding_database         | test_1                                                                                        |
|                20 | test_1                    | { 'user' : 'root' , 'password' : 'root' , 'host' : '127.0.0.1' , 'port' :3306, 'database' : 'test_1' }          |
|                21 | sharding_database_prefix  | test                                                                                          |
|                38 | harding_database          | test_2                                                                                        |
|                39 | test_2                    | { "port" : 3306,  "host" "127.0.0.1" "password" "root" "user" "root" "database" "test_2" } |
|                40 | harding_database          | test_3                                                                                        |
|                41 | test_3                    | { "port" : 3306,  "host" "127.0.0.1" "password" "root" "user" "root" "database" "test_3" } |
+ -------------------+---------------------------+-----------------------------------------------------------------------------------------------+
USE test_2
SHOW TABLES;
+ ------------------+
| Tables_in_test_2 |
+ ------------------+
| buy_order_1      |
| buy_order_10     |
| buy_order_2      |
| buy_order_3      |
| buy_order_4      |
| buy_order_5      |
...


python迁移用户数据到指定的分库分表

流程图

    

         mysql


主程序


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if  __name__ = = '__main__' :
   # 设置公共库配置
   db_config_common  = 
     'user'     'root' ,
     'password' 'root' ,
     'host'     '127.0.0.1' ,
     'port'     3306 ,
     'database' 'test'
   }
  
   sharding  =  ShardingDatabase()
   # 设置公共数据库配置
   sharding.get_conn_cursor(db_config_common,  'common' )
   # 指定用户数据到 哪个库 哪个表,如:用户username3数据迁移到 test_3库 10号表
   sharding.move_data( 'username3' 'test_3' 10
   sharding.move_data( 'username7' 'test_2' 3 )
   sharding.move_data( 'username55' 'test_2' 6 )

上面程序展示了将三位用户的数据迁移到指定的分库和分表中:

1、用户:username3 -> 库:test_3 -> 表:*_10

2、用户:username7 -> 库:test_2 -> 表:*_3

3、用户:username55 -> 库:test_2 -> 表:*_6

分库分表迁移数据python程序:sharding_database.py

迁移后结果展示

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
SELECT  FROM  user ;
+ ---------+-------------+-------------+------------+---------+
| user_id | username    |  password     | table_flag | db_name |
+ ---------+-------------+-------------+------------+---------+
|       3 | username3   | password3   |         10 | test_3  |
|       7 | username7   | password7   |          3 | test_2  |
|      55 | username55  | password55  |          6 | test_2  |
...
  
USE test_3
SELECT  FROM  sell_order_10 LIMIT 0, 1;
+ ---------------------+---------------+---------+---------+--------+
| sell_order_id       | user_guide_id | user_id | price   | status |
+ ---------------------+---------------+---------+---------+--------+
| 3792112071144902657 |             7 |      10 | 9720.00 |      1 |
+ ---------------------+---------------+---------+---------+--------+
SELECT  FROM  buy_order_10 LIMIT 0, 1;
+ ---------------------+---------+---------------+
| buy_order_id        | user_id | user_guide_id |
+ ---------------------+---------+---------------+
| 3792111974680104961 |       3 |             1 |
+ ---------------------+---------+---------------+
SELECT  FROM  goods_10 LIMIT 0, 1;
+ ---------------------+------------+--------+----------+
| goods_id            | goods_name | price  | store_id |
+ ---------------------+------------+--------+----------+
| 3792111953670836225 | goods1     | 370.00 |        3 |
+ ---------------------+------------+--------+----------+
SELECT  FROM  order_goods_10 LIMIT 0, 1;
+ ---------------------+---------------------+---------------------+---------------+--------+------+
| order_goods_id      | sell_order_id       | goods_id            | user_guide_id | price  | num  |
+ ---------------------+---------------------+---------------------+---------------+--------+------+
| 3792112350317776897 | 3792112071144902657 | 3792111953670836225 |             7 | 370.00 |    1 |
+ ---------------------+---------------------+---------------------+---------------+--------+------+
  
USE test_2
SELECT  FROM  sell_order_3 LIMIT 0, 1;
+ ---------------------+---------------+---------+---------+--------+
| sell_order_id       | user_guide_id | user_id | price   | status |
+ ---------------------+---------------+---------+---------+--------+
| 3792112052236980225 |             6 |      10 | 7790.00 |      1 |
+ ---------------------+---------------+---------+---------+--------+
SELECT  FROM  buy_order_3 LIMIT 0, 1;
+ ---------------------+---------+---------------+
| buy_order_id        | user_id | user_guide_id |
+ ---------------------+---------+---------------+
| 3792111974399086593 |       7 |             1 |
+ ---------------------+---------+---------------+
SELECT  FROM  order_goods_3 LIMIT 0, 1;
+ ---------------------+---------------------+---------------------+---------------+---------+------+
| order_goods_id      | sell_order_id       | goods_id            | user_guide_id | price   | num  |
+ ---------------------+---------------------+---------------------+---------------+---------+------+
| 3792112312489349121 | 3792112052236980225 | 3792111952869724161 |             6 | 6368.00 |    2 |
+ ---------------------+---------------------+---------------------+---------------+---------+------+
  
USE test_2
SELECT  FROM  buy_order_3 LIMIT 0, 1;
+ ---------------------+---------+---------------+
| buy_order_id        | user_id | user_guide_id |
+ ---------------------+---------+---------------+
| 3792111974399086593 |       7 |             1 |
+ ---------------------+---------+---------------+

文章出自:http://www.ttlsa.com/mysql/mysql-distributed-database-and-table-python-example/





      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1746038,如需转载请自行联系原作者




相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
MySQL操作利器——mysql-connector-python库详解
MySQL操作利器——mysql-connector-python库详解
900 0
|
16天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
116 15
|
2月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
73 1
|
3月前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
3月前
|
SQL 关系型数据库 MySQL
30天拿下Python之使用MySQL
30天拿下Python之使用MySQL
53 0
|
3月前
|
关系型数据库 MySQL 数据管理
pymysql:Python操作MySQL数据库的又一利器
pymysql:Python操作MySQL数据库的又一利器
37 0
|
3月前
|
SQL 关系型数据库 MySQL
Python小技巧——将CSV文件导入到MySQL数据库
Python小技巧——将CSV文件导入到MySQL数据库
154 0
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
18 3
|
3天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
22 2