在我们的项目中,我们使用带有外部存储的 MySQL 5.0.90(InnoDB 引擎)服务器。我们将 MySQL 数据文件存储在外部存储中。当外部存储因某种原因停机时,我们的行为就会不稳定。所以我们做了一些测试。
在 Windows Server 2008 中
我们物理关闭了外部存储。MySQL 服务停止,我们无法访问服务器。然后我们打开了存储单元,我们可以启动服务
日志
- 120618 14:49:30 InnoDB:文件操作中出现操作系统错误编号 21。
- InnoDB:一些操作系统错误编号描述如下
- InnoDB的:http://dev.mysql.com/doc/refman/5.0/en/operating-system-error-codes.html
- InnoDB:文件名 E:\Data\ibdata1
- InnoDB:文件操作调用:‘aio write’。
- InnoDB:无法继续操作。
我们从操作系统将存储单元脱机。经过 3-4 分钟和一些插入尝试(一些插入尝试成功)后,MySQL 服务停止,我们无法访问服务器。
日志
- 120618 14:27:21 InnoDB:文件操作中出现操作系统错误编号 21。
- InnoDB:一些操作系统错误编号描述如下
- InnoDB的:http://dev.mysql.com/doc/refman/5.0/en/operating-system-error-codes.html
- InnoDB:文件名 E:\Data\ibdata1
- InnoDB:文件操作调用:‘aio read’。
- InnoDB:无法继续操作。
然后我们使存储单元上线并尝试启动服务
日志
- InnoDB:第一个指定数据文件 E:\ibdata1 不存在:
- InnoDB:即将创建的新数据库!
- 120618 14:29:00 InnoDB:将文件 E:\ibdata1 大小设置为 10 MB
- InnoDB:数据库物理上写入文件已满:等待......
- InnoDB:错误:所有日志文件必须同时创建。
- InnoDB:所有日志文件也必须在创建数据库时创建。
- InnoDB:如果您想要更大或更小的日志文件,请关闭
- InnoDB:数据库并确保关闭时没有错误。
- InnoDB: 然后删除现有的日志文件。编辑.cnf 文件
- InnoDB:并重新启动数据库。
- 120618 14:29:00 [错误] 默认存储引擎 (InnoDB) 不可用
- 120618 14:29:00 [错误] 正在中止
然后我们尝试重新配置 MySQL
日志
- InnoDB:页面转储结束
- 120618 14:34:02 InnoDB:页面校验和 1575996416,4.0.14 版本之前的校验和 1371122432
- InnoDB:存储校验和 0,4.0.14 版之前存储校验和 0
- InnoDB:页面 lsn 0 0,页面末尾 lsn 的低4字节为 0
- InnoDB:页码(如果已存储到页面)0,
- InnoDB:空间 ID(如果使用 >= MySQL-4.1.1 创建并且已经存储)0
- 120618 14:34:02 - mysqld 发生异常 0xc0000005;
这可能是因为您遇到了错误。也可能是这个二进制文件或它所链接的某个库已损坏、构建不当或配置错误。此错误也可能是由硬件故障引起的。我们将尽力收集一些信息,希望这些信息有助于诊断问题,但由于我们已经崩溃,肯定出了问题,这可能会失败。
密钥缓冲区大小=0
- 读取缓冲区大小=65536
- 最大使用连接数=0
- 最大连接数=100
- 线程连接=0
mysqld 有可能使用最多 key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = 32000 K 字节的内存,希望这样没问题;如果不行,请减少等式中的某些变量。
thd=00000000
- 尝试回溯。您可以使用以下信息来找出 mysqld 死机的位置。如果此后没有看到任何消息,则表明发生了严重错误...
- 006D2DB6 mysqld-nt.exe!page_cur_search_with_match()[page0cur.c:347]
- 0067A777 mysqld-nt.exe!btr_cur_search_to_nth_level()[btr0cur.c:500]
- 006B2E0E mysqld-nt.exe!btr_pcur_open_on_user_rec()[btr0pcur.c:549]
- 006A5615 mysqld-nt.exe!dict_load_indexes()[dict0load.c:604]
- 006A6424 mysqld-nt.exe!dict_load_sys_table()[dict0load.c:1023]
- 006BBB20 mysqld-nt.exe!dict_boot()[dict0boot.c:378]
- 00668A79 mysqld-nt.exe!innobase_start_or_create_for_mysql()[srv0start.c:1462]
- 00444462 mysqld-nt.exe!innobase_init()[ha_innodb.cc:1427]
- 0044B30D mysqld-nt.exe!ha_init()[handler.cc:483]
- 004B923E mysqld-nt.exe!init_server_components()[mysqld.cc:3431]
- 004BD070 mysqld-nt.exe!win_main()[mysqld.cc:3806]
- c004BD43B mysqld-nt.exe!mysql_service()[mysqld.cc:3967]
- 006E28EF mysqld-nt.exe!_threadstart()[thread.c:196]
- 75583677 kernel32.dll!BaseThreadInitThunk()
- 77359D72 ntdll.dll!RtlInitializeExceptionChain()
- 77359D45 ntdll.dll!RtlInitializeExceptionChain()
- 手册页位于http://dev.mysql.com/doc/mysql/en/crashing.html包含可帮助您找出导致崩溃的原因的信息。120618 14:29:00 [注意] C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqld-nt: 关闭完成
在 Windows Server 2003 中
我们使存储单元离线。经过 3-4 分钟和一些插入尝试(一些插入尝试成功)后,MySQL 服务停止,我们无法访问服务器。
日志
- InnoDB:日志扫描已超过检查点 lsn 0 9834427 120618 14:09:59 InnoDB:数据库未正常关闭!
- InnoDB:开始崩溃恢复。
- InnoDB:从 .ibd 文件读取表空间信息...
- InnoDB:从双写中恢复可能半写的数据页
- InnoDB:缓冲区...
- InnoDB:正在进行恢复:扫描至日志序列号 0 9834574
- 120618 14:09:59 InnoDB:开始将一批日志记录应用到数据库……
- InnoDB:进度百分比: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
- InnoDB:应用批次完成
- 120618 14:10:00 InnoDB:已启动;日志序列号 0 9834574
- 120618 14:10:00 [注意] C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqld-nt:已准备好连接。
- 版本:'5.0.90-community-nt' 套接字:'' 端口:3306 MySQL 社区版(GPL)
- 120618 14:12:36 InnoDB:文件操作中出现操作系统错误编号 21。
- InnoDB:一些操作系统错误编号描述如下
- InnoDB的:http://dev.mysql.com/doc/refman/5.0/en/operating-system-error-codes.html
- InnoDB:文件名 E:\Data\ibdata1
- InnoDB:文件操作调用:‘aio read’。
- InnoDB:无法继续操作。
然后我们将存储单元联机,直到重新安装 MySQL,我们才能启动服务。重新安装之前,我们尝试重新配置,但没有成功。
日志
- 120618 14:16:53 InnoDB:文件操作中出现操作系统错误编号 3。
- InnoDB:该错误表示系统找不到指定的路径。
- InnoDB:如果你正在安装 InnoDB,请记住你必须创建
- InnoDB:自己创建目录,InnoDB 不会创建它们。
- InnoDB:文件名 E:\Data\ibdata1
- InnoDB:文件操作调用:‘创建’。
- InnoDB:无法继续操作。
无法在本地计算机上启动 MySQL 服务。错误 1067:进程意外终止。(错误消息)
我们物理关闭了外部存储。MySQL 服务停止,我们无法访问服务器。之后我们打开了存储单元,我们可以启动服务(不是自动的)
日志
- 120618 14:01:26 InnoDB:文件操作中出现操作系统错误编号 21。
- InnoDB:一些操作系统错误编号描述如下
- InnoDB的:http://dev.mysql.com/doc/refman/5.0/en/operating-system-error-codes.html
- InnoDB:文件名 E:\Data\ibdata1
- InnoDB:文件操作调用:‘aio write’。
- InnoDB:无法继续操作。
我们希望服务在存储单元联机/打开后自动启动。但这些测试显示行为不稳定。对此有什么解决方案吗?
答案1
iSCSI 只是一种允许服务器访问远程模拟 SCSI 磁盘的协议。如果不了解有关实际存储的更多信息(有多少个控制器、是否有写入缓存、是否镜像),我无法确定答案。话虽如此,问题可能是一致性问题。
如果您断开连接到正在运行的数据库的存储,则必须处理所有正在进行的 IO,否则您将面临数据不一致的风险。当您对外部存储进行写入时,它通常会在进入缓存后立即得到确认。一旦发生这种情况,缓存中的数据将被转储到磁盘,但顺序与接收顺序不同。任何导致您丢失缓存的正在进行的 IO 的断电都会导致磁盘丢失写入。
答案2
在我看来,您的错误根源在于底层设备。我会使用其他应用程序对设备进行 IO 测试,看看您是否可以用它来调试错误。设备未准备好和路径未找到错误似乎是根本原因,这表明您的外部存储链接表现不佳。