首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql是否由于“检查表”警告而使用某种类型的自动修复?

mysql是否由于“检查表”警告而使用某种类型的自动修复?
EN

Database Administration用户
提问于 2018-10-27 13:32:26
回答 1查看 305关注 0票数 -1

今天,我注意到MySQL在崩溃的表上使用"CHECK“时的”奇怪“行为。首先,我收到了一个警告,比如“数据文件的大小是:*.应该是:*”,但是我仍然可以“插入/从表中选择”,没有问题,在插入几次之后,警告就消失了。我真的不明白这种行为的意义。

  • 操作系统: Debian 8.6 (jessie)
  • MySQL服务器版本:5.5.60-0+log 8u1-log (Debian)
  • Debian数据库检查"/etc/mysql/debian-start“和/etc/mysql/my.cnf中的myisam-recover选项都是禁用的。

我的测试如下:

  1. 创建表testing( id int(11) NOT AUTO_INCREMENT,lastname varchar(255) NULL,firstname varchar(255)默认值NULL,age int(11)默认值NULL,D12int (id) ENGINE=MyISAM DEFAULT CHARSET=latin1);
  2. 创建了一个简单的php脚本(filltable.php)来连续填充
  3. 我打开了3种不同的外壳
    • 第一个用于执行我的php脚本来连续填充我的testing.persons表。
    • 第二个通过伪造表崩溃来杀死mysql守护进程。
    • 第三个在mysql服务器上执行其他查询。

  4. 我通过在第一个shell php filltable.php中执行php脚本来开始测试。
  5. 在第三个shell中,我检查了表行是否正确地计数mysql>,从testing.persons中选择计数(*);+
  6. 大约30秒后,我在第二个shell中杀死了mysql damoen,以伪造一个表崩溃killall -s SIGKILL /usr/sbin/mysqld
  7. 然后,在第三个shell中执行以下sql查询,以检查表状态是如何变化的

检查桌子

代码语言:javascript
复制
    mysql> check table testing.persons quick;
    +-----------------+-------+----------+-------------------------------------------------------+
    | Table           | Op    | Msg_type | Msg_text                                              |
    +-----------------+-------+----------+-------------------------------------------------------+
    | testing.persons | check | warning  | 1 client is using or hasn't closed the table properly |
    | testing.persons | check | warning  | Size of datafile is: 1877424       Should be: 1877376 |
    | testing.persons | check | status   | OK                                                    |
    +-----------------+-------+----------+-------------------------------------------------------+
    3 rows in set (0.01 sec)

再检查一下桌子

代码语言:javascript
复制
    mysql> check table testing.persons quick;
    +-----------------+-------+----------+-------------------------------------------------------+
    | Table           | Op    | Msg_type | Msg_text                                              |
    +-----------------+-------+----------+-------------------------------------------------------+
    | testing.persons | check | warning  | Size of datafile is: 1877424       Should be: 1877376 |
    | testing.persons | check | status   | OK                                                    |
    +-----------------+-------+----------+-------------------------------------------------------+
    2 rows in set (0.00 sec)

插入新行

代码语言:javascript
复制
    mysql> insert into testing.persons set firstname='somename', age='111';
    Query OK, 1 row affected, 1 warning (0.01 sec)

再检查一下桌子

代码语言:javascript
复制
    mysql> check table testing.persons quick;
    +-----------------+-------+----------+-------------------------------------------------------+
    | Table           | Op    | Msg_type | Msg_text                                              |
    +-----------------+-------+----------+-------------------------------------------------------+
    | testing.persons | check | warning  | Size of datafile is: 1877424       Should be: 1877400 |
    | testing.persons | check | status   | OK                                                    |
    +-----------------+-------+----------+-------------------------------------------------------+
    2 rows in set (0.00 sec)

插入另一行

代码语言:javascript
复制
    mysql> insert into testing.persons set firstname='somename', age='222';
    Query OK, 1 row affected, 1 warning (0.00 sec)

再检查一下桌子

代码语言:javascript
复制
    mysql> check table testing.persons quick;
    +-----------------+-------+----------+----------+
    | Table           | Op    | Msg_type | Msg_text |
    +-----------------+-------+----------+----------+
    | testing.persons | check | status   | OK       |
    +-----------------+-------+----------+----------+
    1 row in set (0.00 sec)

最后,我们以状态"OK“结束,之前的警告”数据文件的大小是: 1877424..“神秘地消失了。

  • What发生在这里?
  • Why是在第二次插入之后删除的“警告”?
  • 如果将新数据插入标记表?,则Does MySQL某种类型的自动修复

如果您使用“普通”表检查而不是“快速”检查运行上面的测试,则情况会变得更加混乱。在这种情况下,将立即检测到表已损坏,并最终将其标记为崩溃:

检查桌子

代码语言:javascript
复制
    mysql> check table testing.persons;
    +-----------------+-------+----------+-------------------------------------------------------+
    | Table           | Op    | Msg_type | Msg_text                                              |
    +-----------------+-------+----------+-------------------------------------------------------+
    | testing.persons | check | warning  | 1 client is using or hasn't closed the table properly |
    | testing.persons | check | warning  | Size of datafile is: 1145136       Should be: 1145088 |
    | testing.persons | check | error    | Record-count is not ok; is 23857   Should be: 23856   |
    | testing.persons | check | warning  | Found 23857 key parts. Should be: 23856               |
    | testing.persons | check | error    | Corrupt                                               |
    +-----------------+-------+----------+-------------------------------------------------------+
    5 rows in set (0.01 sec)

再检查一下桌子

代码语言:javascript
复制
    mysql> check table testing.persons;
    +-----------------+-------+----------+-------------------------------------------------------+
    | Table           | Op    | Msg_type | Msg_text                                              |
    +-----------------+-------+----------+-------------------------------------------------------+
    | testing.persons | check | warning  | Table is marked as crashed                            |
    | testing.persons | check | warning  | 1 client is using or hasn't closed the table properly |
    | testing.persons | check | warning  | Size of datafile is: 1145136       Should be: 1145088 |
    | testing.persons | check | error    | Record-count is not ok; is 23857   Should be: 23856   |
    | testing.persons | check | warning  | Found 23857 key parts. Should be: 23856               |
    | testing.persons | check | error    | Corrupt                                               |
    +-----------------+-------+----------+-------------------------------------------------------+
    6 rows in set (0.01 sec)

<#>To摘要:

快速检查是警告,但是在几次插入之后,警告就消失了,检查显示表没有问题--似乎该表从未损坏或神秘地自动修复过。我完全不清楚为什么会有no问题插入或从表中插入或读取--不是在检查之前,而不是在检查之后,而另一个“正常”检查是立即将表标记为已损坏/崩溃。

EN

回答 1

Database Administration用户

发布于 2018-10-29 04:43:31

使用InnoDB而不是MyISAM。这将避免对CHECKREPAIR的需求。

代码语言:javascript
复制
--myisam-recover-options=QUICK

https://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_米舍尔德_美赛姆-恢复-选择

代码语言:javascript
复制
myisamchk

https://dev.mysql.com/doc/refman/5.7/en/myisam-crash-recovery.html

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/221161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档