分区表在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.
|
mysql>
显示
创建
表
salariesG
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
表:工资
创建
表:
创建
表
“工资”(
列出的
int(11)
非空,
“工资”
int(11)
非空,
“from_date”
日期
非空,
“to_date”
日期
非空,
主键
('列出',' from_date ')
)
引擎
=
InnoDB
默认的
字符集
=latin1
/ * !50500分区BY RANGE COLUMNS(from_date)
(分区p01值小于(1985-12-31)引擎= InnoDB,
分区p02值小于(1986-12-31)引擎= InnoDB,
分区p03值小于(1987-12-31)引擎= InnoDB,
分区p04值小于(1988-12-31)引擎= InnoDB,
分区p05值小于(1989-12-31)引擎= InnoDB,
分区p06值小于(1990-12-31)引擎= InnoDB,
分区p07值小于(1991-12-31)引擎= InnoDB,
分区p08值小于(1992-12-31)引擎= InnoDB,
分区p09值小于(1993-12-31)引擎= InnoDB,
分区p10值小于(1994-12-31)引擎= InnoDB,
分区侯值小于(1995-12-31)引擎= InnoDB,
分区p12值小于(1996-12-31)引擎= InnoDB,
分区p13值小于(1997-12-31)引擎= InnoDB,
分区好值小于(1998-12-31)引擎= InnoDB,
分区p15值小于(1999-12-31)引擎= InnoDB,
分区p16值小于(2000-12-31)引擎= InnoDB,
分区p17值小于(2001-12-31)引擎= InnoDB,
分区p18值小于(2002-12-31)引擎= InnoDB,
分区p19值小于(MAXVALUE)引擎= InnoDB) * /
|
如果我们查询任意的数据集,MySQL返回它很快,没有任何问题。
|
1
2
3
4
5
6
7
|
mysql>
选择
*
从
工资
在哪里
列出=10001年
和
from_date =“1999-06-23”;
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
|列出|工资|from_date|to_date
|
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
|10001年|84917年|1999年- - - - - -06- - - - - -23|2000年- - - - - -06- - - - - -22|
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.00sec)
|
但是一旦数据是错误的,它不返回任何行。
|
1
2
|
mysql>
选择
*
从
工资
在哪里
列出=10001年
和
from_date =“1999-06-23”;
空
集
(0.00sec)
|
乍一看,它看起来像数据已被删除;甚至解释计划没有返回任何结果。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql>
解释
选择
*
从
工资
在哪里
列出=10001年
和
from_date =“1999-06-23”G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
id:1
select_type:简单的
表:
零
分区:
零
类型:
零
possible_keys:
零
关键:
零
key_len:
零
裁判:
零
行:
零
过滤:
零
额外的:
没有
匹配
行
在
常量
表
1
行
在
集,1警告(0.00sec)
|
但是,数据表中仍然存在;只是错误的在一个不同的分区。
|
1
2
3
4
5
6
7
|
mysql>
选择
*
从
工资
分区(p08)
限制
1;
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
|列出|工资|from_date|to_date
|
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
|10001年|84917年|1999年- - - - - -06- - - - - -23|2000年- - - - - -06- - - - - -22|
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.00sec)
|
如何检查是否有更多的错误的行吗?
检查错误的表中的行,我们可以执行检查命令来找到更多的错误的行。
|
1
2
3
4
5
6
7
8
9
|
mysql>
检查表
工资;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
表
|人事处
|Msg_type|Msg_text
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|employees.salaries|
检查
|错误
|发现一个放错了地方
行
在
部分7应该是
在
部分14:from_date: 1999- - - - - -06- - - - - -23
|
|employees.salaries|
检查
|错误
|
分区
p08返回错误
|
|employees.salaries|
检查
|错误
|
表
升级必需的。请
做
“修理表‘工资’”
或
转储/
重新加载
来
修复它!|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
3
行
在
集
(0.83sec)
|
怎么能行是错误的吗?
上述观察确实提出一个问题:如何MySQL允许这种事情发生,以及如何可以固定吗?前者的答案是,MySQL允许用户与一个单独的交换分区表;在我之前的解释博客快速数据档案在MySQL中使用分区默认情况下,它会检查每一行之前将数据插入到表中。
|
1
2
|
mysql>
改变
表
工资交换
分区
p15
与
表
salaries_p15;
查询好吧,0
行
影响(0.04sec)
|
在上面的查询中,salaries_p15是一个空表结构一样吗薪水,除了没有分区。
|
1
2
3
4
5
6
7
8
9
10
11
|
mysql>
显示
创建
表
salaries_p15G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
表:salaries_p15
创建
表:
创建
表
“salaries_p15”(
列出的
int(11)
非空,
“工资”
int(11)
非空,
“from_date”
日期
非空,
“to_date”
日期
非空,
主键
('列出',' from_date ')
)
引擎
=
InnoDB
默认的
字符集
=latin1
1
行
在
集
(0.00sec)
|
后交换分区,分区p15是空的,和salaries_p15 p15数据分区。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
mysql>
选择数(*)
从
salaries_p15;
+ - - - - - - - - - - - +
|
数(*)|
+ - - - - - - - - - - - +
|
260926年|
+ - - - - - - - - - - - +
1
行
在
集
(0.02sec)
mysql>
选择数(*)
从
工资
分区(p15);
+ - - - - - - - - - - - +
|
数(*)|
+ - - - - - - - - - - - +
|
0|
+ - - - - - - - - - - - +
1
行
在
集
(0.06sec)
|
MySQL允许交换分区没有检查每一行,这样可以加快交换数据。
|
1
2
|
mysql>
改变
表
工资交换
分区
p08
与
表
salaries_p15没有验证;
查询好吧,0
行
影响(0.04sec)
|
上面的查询将交换数据和一个空的分区p08 salaries_p15很快,假设数据是正确的。在这种情况下,它将导致错误的行错误的分区。
|
1
2
3
4
5
6
7
|
mysql>
选择
*
从
工资
在哪里
列出=10001年
和
from_date =“1999-06-23”;
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
|列出|工资|from_date|to_date
|
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
|10001年|84917年|1999年- - - - - -06- - - - - -23|2000年- - - - - -06- - - - - -22|
+ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.00sec)
|
如何修复它
有两种方法可以解决它——首先,运行MySQL推荐修理表命令,或第二重新创建表通过运行一个空的改变。
执行维修表时,错误的行安排适当的位置通过分析所有的行,但是它获得一个系统锁在桌子上。
|
1
2
3
4
5
6
7
8
|
mysql>
修复
表
工资;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
表
|人事处
|Msg_type|Msg_text
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|employees.salaries|
修复
|警告|移动260926年放错了地方
行
|
|employees.salaries|
修复
|
状态
|好吧
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2
行
在
集
(5.30sec)
|
另一种方法是运行一个空重新创建表的更改。
一个可以直接改变运行表重新创建表和锁,直到完成改变。
|
1
|
改变
employees.salaries
引擎
=
Innodb;
|
一个也可以使用pt-online模式变化重新创建表,不会锁表和其他好处(在线使用Pe雷竞技下载官网rcona工具箱来改变数据库表:一种控制方法)。
|
1
|
pt- - - - - -在线- - - - - -
模式
- - - - - -
改变
- - -执行
- - -改变
“引擎= InnoDb”
h=本地主机D=员工,t=工资
|
结论
它总是推荐和分区的工作时要格外小心,避免在生产环境中使用未经验证,以避免任何错误的数据。
雷竞技下载官网Percona MySQL是最完整,分布稳定、可伸缩的、开源MySQL和安全解决方案,提供企业级的数据库环境的大多数关键业务应用程序…和免费使用!





