通过frm和ibd恢复数据库

参考地址

  1. https://www.nullalo.com/en/recover-mysql-innodb-tables-without-ibdata1-file/
  2. https://www.cnblogs.com/aeolian/p/10138334.html
  3. https://www.percona.com/blog/2014/01/02/recover-table-structure-frm-files-mysql-utilities/

步骤

  1. 备份var目录, 初始化数据库mysqld --initialize-insecure
  2. 通过mysqlfrm可以从frm中获取表结构
  3. 新建空的数据库, 导入上述表结构
  4. 删除对应的表空间, 将表对应的ibd文件复制到数据目录下
  5. 重新插入表空间

通过mysqlfrm可以从frm中获取表结构

下载地址: https://downloads.mysql.com/archives/utilities/
https://github.com/mysql/mysql-utilities/releases

使用

# 源码安装
python setup.py install

# 查看表结构
# 新增mysql实例来恢复, 能输出编码
# --port 必须和3306不同
mysqlfrm --server=root:rootpassword@localhost:3306 wehospital:t_bind.frm --port=3307

# 通过参数--diagnostic 来恢复
mysqlfrm --diagnostic .t_bind.frm

批量导出

# 导出所有表结构到文件
mysqlfrm --server=root:rootpassword@127.0.0.1 --port 3307 ./*.frm >paycenter.sql

# 因为在命令中使用了数据库命令, 删除第一行警告
sed -i "1d" paycenter.sql

# 在创建表结构语句结尾加上;
sed -i "s/.*ENGINE=.*/&;/" paycenter.sql

问题

  • python是先编译后解释的语言, pyc类似于java的class字节码, 当py文件修改时重新生成pyc文件
  • 如何查看字符类型: type(var)
  1. raise errors.InternalError(“Unread result found”)
# /usr/local/lib/python2.7/site-packages/mysql/utilities/common/server.py line 1327 增加
cur = self.db_conn.cursor(buffered=True)
  1. ‘ascii’ codec can’t decode byte 0xe8 in position 10
importsys
reload(sys)

# sys.setdefaultencoding('utf8')
sys.setdefaultencoding('gb18030')

新建空的数据库, 导入上述表结构

CREATE DATABASE IF NOT EXISTS `paycenter` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
cat paycenter.sql |mysql -uroot -p paycenter

删除对应的表空间, 将表对应的ibd文件复制到数据目录下

单个

  1. 删除对应的表空间
-- 在数据库文件下执行
ALTER TABLE t_account DISCARD TABLESPACE;
  1. 拷贝ibd文件, 需要修改权限为mysql:mysql

批量

ls *.frm|awk -F "." '{print "ALTER TABLE " $1 " DISCARD TABLESPACE;"}'

重新插入表空间

-- 在数据库文件下执行
ALTER TABLE t_account IMPORT TABLESPACE;

mysql

  • 启动报错日志: /usr/local/mysql/var/local.err
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值