mysql备份
1. 直接打包数据库文件夹,如/usr/local/mysql/data/
例子:
mysql> create database abc;
mysql> use abc;
mysql> create table test(name char(10),age int(3));
mysql> insert into test values ('xiaoming',10);
mysql> select * from test;
备份数据
service mysqld stop
cd /usr/local/mysql/data/
yum -y install xz
tar Jcf mysql_all-$(date +%F).tar.xz /usr/local/mysql/data/
模拟数据丢失
[root@localhost ~]# mkdir bak
[root@localhost ~]# mv /usr/local/mysql/data/* bak/
恢复数据:
[root@localhost ~]# mkdir restore
[root@localhost ~]# tar xf mysql_all-2016-12-08.tar.xz -C restore/
[root@localhost ~]# mv restore/usr/local/mysql/data/* /usr/local/mysql/data/
[root@localhost ~]# service mysqld start
查看数据已经恢复
2.完全备份
(1)对单个数据库备份
格式: mysqldump -u 用户名 -p[密码] 数据库名 > /备份路径/备份文件名
例子:
mysqldump -u root aaa > aaa.sql
注意:这种备份方法不会在备份文件中有创建数据库的sql语句。还原时必须手动在数据中创建aaa数据库才能还原。
加上--database 就会自动生成创建数库的sql语句。
(2)对多个库进行完全备份
格式: mysqldump
-u 用户名 -p
[密码] --databases 库名 1 [库名 2]…
> /备份路径/备份文件名
示例:
mysqldump -u root --databases aaa bbb > all.sql
注意:这种方法将两个数据库备份到了一个文件中,在备份的sql文件,会生成创建数据库的sql语句。
(3)对所有库进行完全备份
格式: mysqldump
-u 用户名 -p
[密码] [选项] --all-databases
> /备份路径/备份文件名
示例:
mysqldump -u root --all-databases > all.sql
(4)备份表
格式: mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
mysqldump -uroot aaa test > table_test.sql
还原:
mysql -uroot aaa < table_test.sql
(5)备份表结构
格式: mysqldump
-u 用户名 -p
[密码] -d 数据库名 表名 >
/备份路径/备份文件名
示例:
mysqldump -uroot -d aaa test > table_test.sql
备份实例:
需求描述:
北京移电通信公司的用户信息数据库为 client,用户资费数据表为 user_info
请为该公司每周进行完全备份
每天为该公司进行增量备份
新增加的用户信息如表所示
命令:
create database client;
use client;
create table user_info(身份证 char(20) not null,姓名 char(20) not null,性别 char(4),用户ID号 char(10) not null,资费 int(10));
insert into user_info values('000000006','孙空悟','男','016','10');
insert into user_info values('000000007','蓝精灵','女','017','91');
insert into user_info values('000000008','姜姜','女','018','23');
select * from user_info;
进行一次完全
[root@localhost ~]# mkdir /mysql_bak
[root@localhost ~]# mysqldump -uroot client user_info > /mysql_bak/client_userinfo-$(date
+%F).sql
[root@localhost ~]#mysqldump -uroot client > /mysql_bak/client-$(date
+%F).sql
[root@localhost ~]# ls /mysql_bak/
刷新二进制文件
cd /usr/local/mysql/data/
ls
开始刷新二进制文件
[root@localhost data]# mysqladmin -uroot flush-logs
然后我们开始输入新的数据。这时候新的数据就会生成在新的二进制文件中
mysql> use client;
mysql> insert into user_info values('000000009','关云长','男','019','37');
mysql> insert into user_info values('0000000010','罗纲','男','020','36');
mysql> select * from user_info;
进行增量备份
查看刚才新生成的数据
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000009
备份刚才新生成的数据
[root@localhost ~]# cd /usr/local/mysql/data/
[root@localhost data]# cp -r mysql-bin.000009 /mysql_bak/
模拟误操作删除 user_info
表
[root@localhost ~]# mysql -uroot -e 'drop table client.user_info;'
[root@localhost ~]# mysql -uroot -e 'select * from client.user_info;'
ERROR 1146 (42S02) at line 1: Table 'client.user_info' doesn't exist
恢复完全备份
mysql -uroot client < /mysql_bak/client_userinfo-2016-12-09.sql
mysql -uroot -e 'select * from client.user_info;'
恢复增量备份
mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002
| mysql -u root
在查看是否恢复成功
mysql -uroot -e 'select * from
client.user_info;'
恢复成功。
基于时间点的增量备份恢复
删除表。
在重新恢复一下完全备份
mysql -uroot -e 'drop table client.user_info;'
恢复完全备份
mysql -uroot client < /mysql_bak/client_userinfo-2016-12-09.sql
mysql -uroot -e 'select * from client.user_info;'
我们只恢复关云长的信息
# at 177
#160717 8:55:59 server id 1 end_log_pos 312 Query thread_id=7 exec_time=0 error_code=0
use client/*!*/;
SET TIMESTAMP=1468716959/*!*/;
insert into user_info values('000000009','关云长','男','019','37')
开始恢复
[root@localhost ~]# mysqlbinlog --no-defaults --stop-datetime='2016-07-17 8:56:00' /mysql_bak/mysql-bin.000009 |mysql -u root
仅恢复“罗纲”的信息,跳过“关云长”的信息恢复
删除表。
在重新恢复一下完全备份
mysql -uroot -e 'drop table client.user_info;'
恢复完全备份
mysql -uroot client < /mysql_bak/client_userinfo-2016-12-09.sql
mysql -uroot -e 'select * from client.user_info;'
开始恢复
[root@localhost ~]# mysqlbinlog --no-defaults --start-datetime='2016-07-17 8:56:00' /mysql_bak/mysql-bin.000009 |mysql -u root