• 1 存在定期备份
  • 2 临时备份
  • 3 其他方法

 

恢复数据方法:
下面按照三种场景介绍数据恢复方法:

1 存在定期备份

1.1 启动当天的备份
备份文件一般位于:/data1/backup/mysql<port>/<日期> 目录下
以3999为端口启动(3999表示备份实例),注意:不要自动启动slave

首先需要确定出问题的点位的前一个点位,也就是我们需要同步数据的最后一个正常点位
然后执行:
start slave until MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
1.2 导出导入备份数据
然后dump出来一个sql文件 bak.sql
注意:导出数据时候,根据需求,考虑需要导出表结构以及存储过程,触发器和索引等
注意修改表名为表名_new,然后导入到线上mysql
mysql < bak.sql

此处也可以使用方法2的做法

1.3 改表名
确定无误后,执行
begin;alter table tabname rename to tabname_old;alter table tabname_new rename to tabname;commit;

 

2 临时备份

采用select ... into outfile和load data 进行导出导入
注意:如果存在binary等二进制字段时候,不适合使用这个方法
2.1 备份数据
在mysql server服务器上操作
select * into outfile '/tmp/xxx.sql' from tabname [ where clause ]

2.2 导入数据
手动创建新表(注意不要遗漏索引和存储过程和触发器等等)
load data infile '/tmp/xxxsql' ignore into table tabname_new character set utf8;"
如果已经存在记录,忽略
load data infile '/tmp/xxxsql' replace into table tabname_new character set utf8;"
如果已经存在记录,更新它
(根据要求选择其中一个)

如果用户没有指定一个FIELDS 子句,缺省时如同使用下列语句:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
如果用户没有指定一个LINES 子句,缺省时如同使用下列语句:
LINES TERMINATED BY '\n' STARTING BY ''

换句话说,当读取输入时,缺省的LOAD DATA INFILE 表现如下:
• 在换行符处寻找行的边界。
• 不遗漏任何行前缀。
• 在制表符处将行分离成字段。
• 不认为字段由任何引号字符封装。
• 将有 “\” 开头的定位符、换行符或`\' 解释为字段值的一个文字字符。

2.3 改表名
方法同 1.3 改表名

3 其他方法

使用其他来源的数据,进行恢复,恢复方法参考方法1和方法2

注意:采用create table t1_new select * from t1 wehre 0=1;
不会创建索引等信息
创建新表,建议使用:
mysqldump -u<username> -p<password> --host <hostip> --port <port> --default-character-set=utf8 -E --hex-blob -R --triggers -
n -d --opt --single-transaction dbname tabname [ -w ] > tabname_bak.sql