我的Linux生涯之Mysql:Day05[Mysql之备份]

一、数据的备份

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

 

你可能感兴趣的:(linux,mysql,备份)