《MySQL主库xtrabackup备份导致应用异常》遗留问题(三)

test_myddl都没有closing table成功,为什么不能insert和select成功呢?

这次从四个状态值入手,观察值的变化来确认发生什么?
Open_table_definitions
Open_tables
Opened_table_definitions
Opened_tables

session1:执行以下脚本,同时在session2 flush tables,观察值

mysqladmin -uroot ext -i1 | awk '/Open_table_definitions/ 
/Open_tables/ 
/Opened_table_definitions/ 
/Opened_tables/
 
| Open_table_definitions                   | 3             |
| Open_tables                              | 3             |
| Opened_table_definitions                 | 215           |
| Opened_tables                            | 9894          |
| Open_table_definitions                   | 0             |
| Open_tables                              | 0             |
| Opened_table_definitions                 | 215           |
| Opened_tables                            | 9894          |

session 2:

flush tables

session 3:

root@lx 01:23:36>call sp_myddl;

session 1:

| Open_table_definitions                   | 0             |
| Open_tables                              | 0             |
| Opened_table_definitions                 | 215           |
| Opened_tables                            | 9894          |
| Open_table_definitions                   | 2             |
| Open_tables                              | 2             |
| Opened_table_definitions                 | 217           |
| Opened_tables                            | 9896          |

大家可能会有疑惑为什么Opened_tables,Open_table_definitions是2,因为打开procedure也算一次

session 4:

root@lx 11:31:37>select count(*) from test_myddl a,test_myddl b;

session 1:增加了2没问题

| Open_table_definitions                   | 2             |
| Open_tables                              | 2             |
| Opened_table_definitions                 | 217           |
| Opened_tables                            | 9896          |
| Open_table_definitions                   | 2             |
| Open_tables                              | 4             |
| Opened_table_definitions                 | 217           |
| Opened_tables                            | 9898          |

session 5:

root@lx 01:25:09>flush tables with read lock;

session 1:因FTWRL要关闭表,只有长查询的session4没办法关闭

| Open_table_definitions                   | 2             |
| Open_tables                              | 4             |
| Opened_table_definitions                 | 217           |
| Opened_tables                            | 9898          |
| Open_table_definitions                   | 1             |
| Open_tables                              | 2             |
| Opened_table_definitions                 | 217           |
| Opened_tables                            | 9898          |

杀掉session 5:状态值未发生变化
杀掉session 4:

| Open_table_definitions                   | 1             |
| Open_tables                              | 2             |
| Opened_table_definitions                 | 217           |
| Opened_tables                            | 9898          |
| Open_table_definitions                   | 1             |
| Open_tables                              | 1             |
| Opened_table_definitions                 | 218           |
| Opened_tables                            | 9899          |

发现open_tables、Open_table_definitions值变成1,经过了一次flush tables,test_myddl被重新打开。

上次提过,FTWRL做三件事情

【1】	sets the global read lock  
【2】	close open tables 
【3】	sets a flag to block commits

猜想:当kill session5时,并没有退出close open tables代码(只对关闭不成功的表),当kill session4时,flush tables终于成功,但此时global read lock已不存在,跳出FTWRL整个代码块,所有操作恢复正常


Post a Comment