# MySQL中的备份及恢复 ## 全量备份 ```bash # 备份某个库 mysqldump -u用户名 -p密码 数据库 > /path/文件名.sql # 备份多个库 mysqldump -u用户名 -p密码 -B 库名1 库名2 库名3 > /path/文件名.sql # 备份全部库 mysqldump -u用户名 -p密码 -A > /path/文件名.sql #备份表 mysqldump -u用户名 -p密码 数据库 表名 > /path/文件名.sql #备份表结构 mysqldump -u用户名 -p密码 -d 数据库 > /path/文件名.sql # 恢复库 mysql -u用户名 -p密码 库名 < /path/文件名.sql # 恢复表 mysql -u用户名 -p密码 库名 < /path/文件名.sql ``` ## 增量备份 MySQL没有提供直接的增量备份方法 可以通过 MySQL提供的二进制日志( binary logs)间接实现增量备份 ``` #修改my.cnf以实现mysql的二进制日志 sudo vim /etc/my.cnf ``` 在配置文件中[mysqld]下加入 ``` [mysqld] ## 定义服务器 id,主从时需要每一台服务器都有自己的ID server_id = 1 # 二进制日志路径 log-bin = /data/mysql/mysql-bin # 主从复制的模式,可选值为 STATEMENT, ROW, MIXED 语句级 行级 动态的选择 binlog_format = ROW ``` 重启服务 ```bash systemctl restart mysqld ``` 查看data目录下mysql文件夹是否生成mysql-bin.000001文件 ```bash ls /data/mysql/mysql-bin ``` 二进制日志在启动 MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到 flush-logs命令后重新创建新的日志文件 ```bash mysqladmin -u 用户名 -p 密码 flush-logs ``` 查看到日志文件中的操作语句 ```bash mysqlbinlog --no-defaults --base64-output=decode-rows -v 日志文件名称 /opt/aaa.txt #使用64位解码器按行输出日志文件放到/opt/aaa.txt中 cat /opt/aaa.txt #查看日志文件的详细信息 ``` 一般恢复 ```bash mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p ``` 断点恢复 基于位置恢复 就是将某个起始时间的二进制日志导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复 ```bash #恢复数据到指定位置 mysqlbinlog --stop-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码 #从指定的位置开始恢复数据 mysqlbinlog --start-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码 ``` 基于时间点恢复 使用基于时间点的恢复,可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,所以我们需要一种更为精确的恢复方式 ```bash #从日志开头截止到某个时间点的恢复 mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码 #从某个时间点到日志结尾的恢复 mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码 ``` ## mysql数据库迁移及恢复 数据库迁移有两种方式 全量备份后到新服务器上重新安装mysql后恢复 备份data文件夹和my.cnf 新服务器重新安装mysql后不进行初始化 把data文件夹和my.cnf重新放回相同位置 启动即可