我正在尝试通过制作主数据目录的 lvm 快照并将其复制到从属来设置 mysql 复制。
该过程非常简单,在主服务器上我执行“FLUSH TABLES WITH READ LOCK”,然后在第二个终端上使用制作 lvm 快照lvcreate -l40%FREE -s -n mysql-backup /dev/MySQL/mysql
,然后解锁表。
接下来我挂载快照并将 datadir 复制到从属,但 mysql 无法启动并出现错误:
150105 12:50:53 mysqld_safe 使用 /var/lib/mysql 中的数据库启动 mysqld 守护进程 150105 12:50:53 [警告] 更改的限制:max_open_files:1024 max_connections:100 table_cache:457 150105 12:50:54 InnoDB:InnoDB 内存堆已禁用 150105 12:50:54 InnoDB:互斥锁和 rw_locks 使用 GCC 原子内置函数 150105 12:50:54 InnoDB:压缩表使用 zlib 1.2.7 150105 12:50:54 InnoDB:使用 Linux 原生 AIO 150105 12:50:54 InnoDB:初始化缓冲池,大小 = 3.9G 150105 12:50:54 InnoDB:缓冲池初始化完成 150105 12:50:54 InnoDB:支持的最高文件格式是 Barracuda。 InnoDB:日志扫描已超过检查点 lsn 29552065932592 150105 12:50:54 InnoDB:数据库未正常关闭! InnoDB:开始崩溃恢复。 InnoDB:从 .ibd 文件读取表空间信息... InnoDB:错误:尝试添加名称为“./somedatabase/CRM_printers.ibd”的表空间 210146 InnoDB:将表空间缓存到内存中,但表空间 InnoDB:名称为“./somedatabase/status.ibd”的 210146 已存在于表空间中 InnoDB:内存缓存! 150105 12:50:55 mysqld_safe mysqld 从 pid 文件 /var/run/mysqld/mysqld.pid 结束
我检查了一下,发现这些表的文件确实存在。因此,接下来我使用 innodb_force_recovery=1 启动了数据库,然后 mysql 启动时出现了很多错误,如下所示:
InnoDB:开始崩溃恢复。 InnoDB:从 .ibd 文件读取表空间信息... InnoDB:错误:尝试添加名称为“./db/k.ibd”的表空间 210146 InnoDB:将表空间缓存到内存中,但表空间 InnoDB:表空间中已存在名称为“./db/y.ibd”的 210146 InnoDB:内存缓存! InnoDB:innodb_force_recovery 设置为 1。继续崩溃恢复 InnoDB:即使该表的表空间创建失败。 InnoDB:错误:尝试添加名称为“./db/a.ibd”的表空间 210235 InnoDB:将表空间缓存到内存中,但表空间 InnoDB:表空间中已存在名称为“./db/ty.ibd”的 210235 InnoDB:内存缓存! InnoDB:innodb_force_recovery 设置为 1。继续崩溃恢复 InnoDB:即使该表的表空间创建失败。 InnoDB:错误:尝试添加名称为“./db/PC.ibd”的表空间 210285 InnoDB:将表空间缓存到内存中,但表空间 InnoDB:表空间中已存在名称为“./portal/HR.ibd”的 210285 InnoDB:内存缓存!
现在我正在这个数据库上运行 mysqlcheck -A,并且有一个输出表明某些表不存在,但 frm 和 idb 文件存在。
问题是什么?我的快照有问题吗?