MySQL分库分表分库准备(6th)

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

前言

随着业务的发展单库中的分表的数量越来越多, 使用在单库上存放过多的表这样是不合理的。因此,我们就需要考虑将数据根据数据库进行拆分。

一般mysql不建议表的数量超过1000个。当然,这不能一概而论,还需要根据你的数据量,和硬件来确定然后根据自己的服务器调整几个mysql '%open%' 参数,从而来确定你的库应该不超过几张表性能能在可接受范围内。

分库思路

在分库前我们需要确定一下我们应该如何去分库:

1、我们是根据用户ID来进行分库,和分表的思路一样。

2、我们需要在用户表中标记一下用户的数据是在哪个库。

3、在系统设置表中应该记录下当前最大分库数量。

4、在系统设置表中应该记录现在所有分库的库名。

5、在系统设置表中应该记录每个分库的数据库连接描述符信息。

分库规则

我们以 '数字' 为分库标识最终分库的名称如:test_1、test_2、test_3 ...

在新增加库的时候,我们在新库中创建的表的数量是在系统设置表中的最大分表数。如在系统设置表中 name='max_sharding_table_num' 的 value='10',这时我们会初始化每个分表的个数为10个。

数据迁移

和分表一样我们应该很清楚哪些表是需要进行分库,我们需要分库的表有 buy_order_n、goods_n、sell_order_n、order_goods_n。

我们应该将之前的数据的库名进行统一。如之前test库的数据要先迁移到 test_1 上

提醒:数据迁移慎重,不是说迁移就迁移的。其实也可以不用迁移的,如果不迁移之后的自动分库的代码就需要做多一点的判断。这为了统一我就做了迁移。

数据迁移SQL

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
-- 创建新库
CREATE  DATABASE  test_1;
use test;
-- 拼出需要创建的表
SELECT  CONCAT( 'CREATE TABLE test_1.' ,
   TABLE_NAME,
   ' LIKE ' ,
   TABLE_SCHEMA,  '.' , TABLE_NAME,  ';'
)              
FROM  information_schema.tables
WHERE  TABLE_SCHEMA =  'test' ;
-- 创建表这边我们不迁移公用的表:user、store、user_guide、system_setting
CREATE  TABLE  test_1.buy_order_1  LIKE  test.buy_order_1;
CREATE  TABLE  test_1.buy_order_10  LIKE  test.buy_order_10;
CREATE  TABLE  test_1.buy_order_2  LIKE  test.buy_order_2;
CREATE  TABLE  test_1.buy_order_3  LIKE  test.buy_order_3;
CREATE  TABLE  test_1.buy_order_4  LIKE  test.buy_order_4;
CREATE  TABLE  test_1.buy_order_5  LIKE  test.buy_order_5;
CREATE  TABLE  test_1.buy_order_6  LIKE  test.buy_order_6;
CREATE  TABLE  test_1.buy_order_7  LIKE  test.buy_order_7;
CREATE  TABLE  test_1.buy_order_8  LIKE  test.buy_order_8;
CREATE  TABLE  test_1.buy_order_9  LIKE  test.buy_order_9;
CREATE  TABLE  test_1.goods_1  LIKE  test.goods_1;
CREATE  TABLE  test_1.goods_10  LIKE  test.goods_10;
CREATE  TABLE  test_1.goods_2  LIKE  test.goods_2;
CREATE  TABLE  test_1.goods_3  LIKE  test.goods_3;
CREATE  TABLE  test_1.goods_4  LIKE  test.goods_4;
CREATE  TABLE  test_1.goods_5  LIKE  test.goods_5;
CREATE  TABLE  test_1.goods_6  LIKE  test.goods_6;
CREATE  TABLE  test_1.goods_7  LIKE  test.goods_7;
CREATE  TABLE  test_1.goods_8  LIKE  test.goods_8;
CREATE  TABLE  test_1.goods_9  LIKE  test.goods_9;
CREATE  TABLE  test_1.order_goods_1  LIKE  test.order_goods_1;
CREATE  TABLE  test_1.order_goods_10  LIKE  test.order_goods_10;
CREATE  TABLE  test_1.order_goods_2  LIKE  test.order_goods_2;
CREATE  TABLE  test_1.order_goods_3  LIKE  test.order_goods_3;
CREATE  TABLE  test_1.order_goods_4  LIKE  test.order_goods_4;
CREATE  TABLE  test_1.order_goods_5  LIKE  test.order_goods_5;
CREATE  TABLE  test_1.order_goods_6  LIKE  test.order_goods_6;
CREATE  TABLE  test_1.order_goods_7  LIKE  test.order_goods_7;
CREATE  TABLE  test_1.order_goods_8  LIKE  test.order_goods_8;
CREATE  TABLE  test_1.order_goods_9  LIKE  test.order_goods_9;
CREATE  TABLE  test_1.sell_order_1  LIKE  test.sell_order_1;
CREATE  TABLE  test_1.sell_order_10  LIKE  test.sell_order_10;
CREATE  TABLE  test_1.sell_order_2  LIKE  test.sell_order_2;
CREATE  TABLE  test_1.sell_order_3  LIKE  test.sell_order_3;
CREATE  TABLE  test_1.sell_order_4  LIKE  test.sell_order_4;
CREATE  TABLE  test_1.sell_order_5  LIKE  test.sell_order_5;
CREATE  TABLE  test_1.sell_order_6  LIKE  test.sell_order_6;
CREATE  TABLE  test_1.sell_order_7  LIKE  test.sell_order_7;
CREATE  TABLE  test_1.sell_order_8  LIKE  test.sell_order_8;
CREATE  TABLE  test_1.sell_order_9  LIKE  test.sell_order_9;
-- 生成插入表的数据
SELECT  CONCAT( 'INSERT INTO ' ,
   TABLE_SCHEMA,  '.' , TABLE_NAME,
   ' SELECT * FROM test' '.' , TABLE_NAME,  ';'
)              
FROM  information_schema.tables
WHERE  TABLE_SCHEMA =  'test_1' ;
-- 插入数据
INSERT  INTO  test_1.buy_order_1  SELECT  FROM  test.buy_order_1;
INSERT  INTO  test_1.buy_order_10  SELECT  FROM  test.buy_order_10;
INSERT  INTO  test_1.buy_order_2  SELECT  FROM  test.buy_order_2;
INSERT  INTO  test_1.buy_order_3  SELECT  FROM  test.buy_order_3;
INSERT  INTO  test_1.buy_order_4  SELECT  FROM  test.buy_order_4;
INSERT  INTO  test_1.buy_order_5  SELECT  FROM  test.buy_order_5;
INSERT  INTO  test_1.buy_order_6  SELECT  FROM  test.buy_order_6;
INSERT  INTO  test_1.buy_order_7  SELECT  FROM  test.buy_order_7;
INSERT  INTO  test_1.buy_order_8  SELECT  FROM  test.buy_order_8;
INSERT  INTO  test_1.buy_order_9  SELECT  FROM  test.buy_order_9;
INSERT  INTO  test_1.goods_1  SELECT  FROM  test.goods_1;
INSERT  INTO  test_1.goods_10  SELECT  FROM  test.goods_10;
INSERT  INTO  test_1.goods_2  SELECT  FROM  test.goods_2;
INSERT  INTO  test_1.goods_3  SELECT  FROM  test.goods_3;
INSERT  INTO  test_1.goods_4  SELECT  FROM  test.goods_4;
INSERT  INTO  test_1.goods_5  SELECT  FROM  test.goods_5;
INSERT  INTO  test_1.goods_6  SELECT  FROM  test.goods_6;
INSERT  INTO  test_1.goods_7  SELECT  FROM  test.goods_7;
INSERT  INTO  test_1.goods_8  SELECT  FROM  test.goods_8;
INSERT  INTO  test_1.goods_9  SELECT  FROM  test.goods_9;
INSERT  INTO  test_1.order_goods_1  SELECT  FROM  test.order_goods_1;
INSERT  INTO  test_1.order_goods_10  SELECT  FROM  test.order_goods_10;
INSERT  INTO  test_1.order_goods_2  SELECT  FROM  test.order_goods_2;
INSERT  INTO  test_1.order_goods_3  SELECT  FROM  test.order_goods_3;
INSERT  INTO  test_1.order_goods_4  SELECT  FROM  test.order_goods_4;
INSERT  INTO  test_1.order_goods_5  SELECT  FROM  test.order_goods_5;
INSERT  INTO  test_1.order_goods_6  SELECT  FROM  test.order_goods_6;
INSERT  INTO  test_1.order_goods_7  SELECT  FROM  test.order_goods_7;
INSERT  INTO  test_1.order_goods_8  SELECT  FROM  test.order_goods_8;
INSERT  INTO  test_1.order_goods_9  SELECT  FROM  test.order_goods_9;
INSERT  INTO  test_1.sell_order_1  SELECT  FROM  test.sell_order_1;
INSERT  INTO  test_1.sell_order_10  SELECT  FROM  test.sell_order_10;
INSERT  INTO  test_1.sell_order_2  SELECT  FROM  test.sell_order_2;
INSERT  INTO  test_1.sell_order_3  SELECT  FROM  test.sell_order_3;
INSERT  INTO  test_1.sell_order_4  SELECT  FROM  test.sell_order_4;
INSERT  INTO  test_1.sell_order_5  SELECT  FROM  test.sell_order_5;
INSERT  INTO  test_1.sell_order_6  SELECT  FROM  test.sell_order_6;
INSERT  INTO  test_1.sell_order_7  SELECT  FROM  test.sell_order_7;
INSERT  INTO  test_1.sell_order_8  SELECT  FROM  test.sell_order_8;
INSERT  INTO  test_1.sell_order_9  SELECT  FROM  test.sell_order_9;
  
-- 向系统表中添加当前最大分库数量
INSERT  INTO  test.system_setting
VALUES ( NULL 'max_sharding_database_num' , 1);
-- 向系统表中添加分库名前缀
INSERT  INTO  test.system_setting
VALUES ( NULL 'sharding_database_prefix' 'test' );
-- 向系统表中添加当前有哪些分库
INSERT  INTO  test.system_setting
VALUES ( NULL 'sharding_database' 'test_1' );
-- 修改系统表字段类value型为varchar(120)
ALTER  TABLE  test.system_setting
MODIFY  `value`  varchar (120)  NOT  NULL  COMMENT  '系统设置值' ;
-- 向系统表添加响应数据库链接描述符
INSERT  INTO  test.system_setting
VALUES ( NULL 'test_1' '{"user":"root","password":"root","host":"127.0.0.1","port":3306,"database":"test_1"}' );
  
-- 初始化用户所在库为test_1
ALTER  TABLE  user
ADD  db_name  VARCHAR (45)  NOT  NULL  DEFAULT  'test_1'
COMMENT  '用户数据所在数据库名' ;


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




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



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
存储 算法 关系型数据库
(二十二)全解MySQL之分库分表后带来的“副作用”一站式解决方案!
上篇《分库分表的正确姿势》中已经将分库分表的方法论全面阐述清楚了,总体看下来用一个字形容,那就是爽!尤其是分库分表技术能够让数据存储层真正成为三高架构,但前面爽是爽了,接着一起来看看分库分表后产生一系列的后患问题,注意我这里的用词,是一系列而不是几个,也就是分库分表虽然好,但你要解决的问题是海量的。
457 3
|
3月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
527 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
4月前
|
SQL 算法 Java
(二十六)MySQL分库篇:Sharding-Sphere分库分表框架的保姆级教学!
前面《MySQL主从原理篇》、《MySQL主从实践篇》两章中聊明白了MySQL主备读写分离、多主多写热备等方案,但如果这些高可用架构依旧无法满足业务规模,或业务增长的需要,此时就需要考虑选用分库分表架构。
2790 4
|
4月前
|
存储 SQL 关系型数据库
(二十一)MySQL之高并发大流量情况下海量数据分库分表的正确姿势
从最初开设《全解MySQL专栏》到现在,共计撰写了二十个大章节详细讲到了MySQL各方面的进阶技术点,从最初的数据库架构开始,到SQL执行流程、库表设计范式、索引机制与原理、事务与锁机制剖析、日志与内存详解、常用命令与高级特性、线上调优与故障排查.....,似乎涉及到了MySQL的方方面面。但到此为止就黔驴技穷了吗?答案并非如此,以《MySQL特性篇》为分割线,整个MySQL专栏从此会进入“高可用”阶段的分析,即从上篇之后会开启MySQL的新内容,主要讲述分布式、高可用、高性能方面的讲解。
327 1
|
5月前
|
算法 搜索推荐 NoSQL
面试题MySQL问题之分库分表后的富查询问题处理如何解决
面试题MySQL问题之分库分表后的富查询问题处理如何解决
54 3
|
5月前
|
算法 关系型数据库 MySQL
MySQL分库分表
【7月更文挑战第11天】分库分表策略涉及数据源、库和表的划分,如订单表可能分布于多层结构中。面试时,主键生成是关键点。自增主键在不分库分表时适用,但在分表场景下会导致冲突。例如,按`buyer_id % 2`分两张表,自增ID无法保证全局唯一。因此,需要全局唯一且能自增的ID,如雪花算法,兼顾性能和高并发需求。
44 1
|
5月前
|
SQL 关系型数据库 MySQL
mysql面试之分库分表总结
mysql面试之分库分表总结
84 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