一、数据的备份
1.1为什么要做数据备份?
1.2数据备份的备份方式?
物理备份 cp tar tar+gzip
//操作平台不一样,使用的文件系统不一样,则物理备份不一定兼容。
//数据大小则占用的备份一样所需容量。
逻辑备份 备份创建库或表时的SQL语句
//根据库的结构及数据生成SQL语句
//占用空间小,速度快。兼容性好。
通常使用逻辑备份。
1.3备份策略
完整/完全备份 //把数据库服务器上所有库所有表全部备份
差异备份 //自“完整备份后” 产生的新数据
增量备份 //备份“自上一次备份后”产生的新数据
完整备份+差异备份 (天、周、月)
备份当前所有的数据。
//如以天为周期:
天 备份类型 当前数据 备份数据 备份生成的文件
Day1 做完整备份 db10 db10 1.bak
Day2 做差异备份 db10、db20 db10、db20 2.bak
....
//备份数据要放在另一台备份服务器中。
优点:
每次备份都相当于完全备份。
恢复时,只要恢复最后一天备份的数据即可。
缺点:
备份时间长。占用容量大。
在没有到备份时间时,服务挂了,这期间新增的数据则无法恢复这期间的数据,解决这个问题的方法就是使用binlog。记录插入数据的记录。
完整备份+增量备份
自上一次备份所产生的新数据。
天 备份类型 当前数据 备份数据 备份生成的文件
Day1 做完整备份 db10 db10 1.bak
Day2 做增量备份 db10、db20 db20 2.bak
....
优点:
备份快,占用容量小。
缺点:
备份数据不太安全,若某一天的备份数据丢失,则当天的数据就无法恢复了。
1.4备份工具
mysqldump 完整备份
//安装mysql-xxx.xxx.xxx.rpm
命令格式
备份用户要对库有权限。
远程备份同样要有权限从这台主机登陆到服务器,同样也要有对库的权限。
mysqldump [ -h数据器地址/主机名 -u登陆用户名 -p密码 ] DATANAME > 路径/BAKFILE.sql
//mysql的备份文件名一般为 库/表.sql,名字无所谓,但是要以*.sql结尾
//若不指定路径,那么这个备份文件 是在当前所在的目录内。
PS:
若备份的是当前主机的数据库且没有密码,且为root用户,则可以省略[]
--all-databases 所有库所有表;
数据库名 单个数据库;
-B 数据库名1 数据库名2 数据库名3 指定数据库;
数据库名 表名 备份某一个表;
//如:dorp from a;
//如果这个表不存在,则会报错,那么,加上 if exists就不会报错了。
// mysql> drop from if exists TABNAME;
//加锁: lock tabels "TABNAME" wirte; /写锁
例:
mysqldump -h192.168.1.1 -uroot -p123456 --all-datebases >/mysqlbak/all.sql
mysqldump -h192.168.1.1. -uroot -p123456 mysql user >/mysqlbak/user-`date +%D`.sql
// ``表示获取这个命令的结果。
二、数据的恢复
mysql [ -h数据器地址/主机名 -u登陆用户名 -p密码 ] DATANAME < BAKFILE
DATANAME是可选的:当恢复数据时使用的备份文件里有建库使用库的SQL语句时,数据库名(DATANAME)可以省略,反之必须写。
如果没有指定备份中DATANAME,则可以随意指定将数据恢复到哪个库。
三、mysql日志类型
/etc/my.conf //修改配置文件来启用
1、错误日志
//Mysql服务启动或运行时产生的错误
[mysqld_safe]
log-error=/var/log/mysqld.log
shell>service mysqld start
2、查询日志
//记录在数据库服务器上执行的所有SQL操作
[mysqld]
log
shell>service mysqld start
默认是在/var/lib/mysql/mysqld.log
也可以指定存放位置,如:
[mysqld]
log=/mysql/log/mysqld.log
注意:mysqld要对/mysql/log目录有权限
3、慢查询日志
//记录超过指定时间(默认10秒)显示查询结果的SQL语句
修改主配置文件
/etc/my.cnf
log-slow-queries= DIRECTORY/FILENAME
//指定慢查询日志文件
//默认不指定则为/var/lib/mysql/mysqld-slow.log
logn-queries-time= TIME(秒)
//指定超时时间
mysql>select sleep(12);
//sleep,函数,延迟12秒显示结果。
4、二进制日志(binlog)日志
记录除查询之外的SQL语句,如:
查询语句: select show desc
非查询语句: insert delete update grant revoke
//记录除查询之外的SQL语句,也可以说只记录使用数据库发生变化的SQL语句。
默认情况下只有“错误日志”是开启的,要想使用其它3种日志须要手动开启。
修改配置文件
/etc/my.cnf
log-bin
/var/lib/mysql/mysqld-bin.000001
//binlog日志文件(日志文件编号从1开始)
//且这是一个二进制文件。
使用mysqlbinlog命令来查看这个二进制文件。
[root@localhost mysql]# mysqlbinlog mysqld-bin.000001
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#140106 14:16:47 server id 1 end_log_pos 98 Start: binlog v 4, server v 5.0.95-log created 140106 14:16:47 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
//这些是默认的初始内容
默认当前binlog文件大于500M时,则生成mysqld-bin.000002
修改主配置文件来更改
/etc/my.cnf
[mysqld]
log-bin
//log-bin=/mysql/mysqld-bin.log,
max_binlog_size= 数字M
/var/lib/mysql/mysqld-bin.index
./mysqld-bin.000001
//记录已有的binlog文件列表。
如何生成新的binlog文件(默认binlog达到指定大小时,才会生成新的binlog文件)
1、重启mysqld服务
[root@localhost ~]# service mysqld restart
停止 mysqld: [确定]
启动 mysqld: [确定]
[root@localhost ~]# ls /var/lib/mysql/mysqld-bin.00000*
/var/lib/mysql/mysqld-bin.000001 /var/lib/mysql/mysqld-bin.000002
2、刷新数据库
mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# ls /var/lib/mysql/mysqld-bin.00000*
/var/lib/mysql/mysqld-bin.000001 /var/lib/mysql/mysqld-bin.000002 /var/lib/mysql/mysqld-bin.000003
//在mysql下
[root@localhost ~]# mysql -e "flush logs"
[root@localhost ~]# ls /var/lib/mysql/mysqld-bin.00000*
/var/lib/mysql/mysqld-bin.000001 /var/lib/mysql/mysqld-bin.000003
/var/lib/mysql/mysqld-bin.000002 /var/lib/mysql/mysqld-bin.000004
//在服务器中执行
[root@ser1 ~]# mysql -h192.168.10.2 -uroot -p123qwe -e "flush logs"
//远程端
shell> mysqldump -uroot -p123 --flush-logs DATANAME > LOGFILE
//备份binlog文件,且重新生成binlog文件。
shell> mysqladmin -uroot -p123 flush-logs
恢复binlog备份的记录:
[root@localhost mysql]# mysqlbinlog --start-position=184 --stop-position=365 BINGLOG.sql |mysql
四、用binlog日志实现增量备份
binlog文件记录SQL语句的方式
时间点 time
字符偏移量 position
//通过字符偏移量的值来查看。
[root@localhost mysql]# mysqlbinlog --start-position=184 --stop-position=273 mysqld-bin.000006
--start-position 起始字符
--stop-position 结束字符
--start-datetime="YY-HH-DD hh:mm:ss"
--stop-datetime="YY-HH-DD hh:mm:ss"
//这两种查看方式不能同时使用
恢复binlog备份的记录:
mysqlbinlog [选项] binlog文件名 | mysql -uroot -p123
[root@localhost mysql]# mysqlbinlog --start-position=184 --stop-position=365 mysqld-bin.000006 |mysql
//恢复指定的某段记录。
crontab -e
00 23 * * 1 mysqldump --flush-logs -A > /mysqlbak/mysqld-`date +%F`.sql
//也可以分别对某个库进行定期备份,如:
00 23 * * 1 mysqldump --flush-logs DATANAME > /mysqlbak/DATANAME-`date +%F`.sql
mysqld-bin.000001 DATANAME.2014-01-07.sql
mysqld-bin.000002 DATANAME.2014-01-14.sql
mysqld-bin.000003 DATANAME.2014-01-21.sql
[root@localhost mysql]# mysqldump -A > mysql.bak
[root@localhost mysql]# du mysql mysql.bak
828 mysql
440 mysql.bak
[root@localhost mysql]# du -h mysql mysql.bak
828K mysql
440K mysql.bak