这是一步步从头学习MySQL的笔记历程,本人在学习之前只接触过少量SQL Server。

第一天历程:压榨自己的学习能力极限,每天学习新内容之MySQL服务器!(一)
第二天历程:压榨自己的学习能力极限,每天学习新内容之MySQL服务器!(二)
第三天历程:压榨自己的学习能力极限,每天学习新内容之MySQL服务器!(三)

接下来每天都将更新~相信你通过笔记,一定能从零学会MySQL~

废话不多说,开始今天的学习压榨~!




MySQL的备份和恢复

我们知道如果把表数据放在Raid1上,一块硬盘坏了我们可以继续使用,那么是否就意味着我们可以不用备份了呢?当然不是,假设我们不小心执行了”drop database mydb”。是否可以备份,只要执行一个删除语句,看是否能将其还原回来,这才是备份。而Raid只是在硬件级别上作出的冗余备份。

对于我们Mysql来说,最重要的就是数据本身,所以我们必须能确保数据本身不会出现任何问题。而当出现问题的时候,我们如何能将损失降到最低,尽可能的将数据找回来,此时,我们就需要用到备份。

但是注意,备份永远解决不了数据的恢复,还原才能。很多人仅仅只是备份了,备份之后的数据,将备份的东西随手一扔,或者备份完成之后不检查自己的备份到底是否能够使用。所以备份解决不了任何问题,还原才能。而作为一个好的DBA,完全掌握备份和恢复,才是工作的重中之重。

数据库的日志文件:

日志一般有两类:

   1.事物日志:实现为数据库服务器提供以下几种功能:

   →将随机IO事件转换为顺序IO(可以大大提高数据库性能),所有的写操作不是被立即放在磁盘上去的,而是先放到了在磁盘上的一段连续空间:事物空间。之后再由RDBMS控制文件内容将其同步进硬盘内。这样让硬盘在寻道的时候速度就非常快,所以理论上顺序IO比随机IO快N倍。

→事件重放(撤销)的基础。能够保证数据库的事物在掉电之后依然完整,再下次开启之后依然能将数据同步到数据库中。

   2.事件日志:过去的一段时间内某个关键时刻发生了什么事情

其实就是历史事件,只记录某点某时某刻做了什么事情。而事物日志则是记录了做这些事情怎么做的,里面操作了什么数据,操作了多少等等精确的内容。事务日志一般只记录写操作。

一:MySQL的日志分类:

错误日志 the error log

二进制日志 the binary log

普通的查询日志 the general guery log :通用查询,谁查询了什么的等

慢查日志 the slow query log :执行过程超出了某些特定时间长度的日志(比如记录超过1秒查询的那次任务)

中继日志 the relay log

默认情况下,我们的MySQL没有启动任何日志。而启动MySQL的那个脚本,帮我们开启了错误日志,错误日志的文件在data下,叫做*.err

二:错误日志:

不仅仅记录了错误信息,还主要记录了MySQL进程在启动和停止的时候产生的信息,如果我们使用了主从复制的功能的话,在服务器上启动复制的进程的时候,进程信息也会记录在错误日志中。

如何去启用error log呢?

只需要在服务器的主配置文件里,定义:

log-error = /var/log/mysqld.err

   (如果改到其他位置,请确保Mysql用户在那个位置上有写权限)

如果没有定义这样日志的话,启动时的错误信息,都会输出到屏幕上来。所以我们的Mysql

错误日志的命名格式:服务器名.err

   SHOW VARIABLES LIKE ‘%log%’,可以看到关于log的信息,

log_error:这个值就是我们错误日志文件的路径,我们也可以手动设置修改它的值。

      log_output:日志输出的保存格式,默认都是FILE,保存为一个文件,其实也可以保存到表中

三:二进制日志:

   有点类似于事物日志,它也能提供事物重放功能,但是它不能取代事物日志,它存在的主要目的,可以提供:

   1.增量备份机制

   2.基于时间点的恢复(可以手动控制,恢复到什么位置,什么时间恢复等)

   3.复制架构的基础(只要把二进制日志复制到另一台机子上,执行二进制日志中的内容,则)

二进制日志的开启,会给服务器增加很大的压力,但是考虑到二进制日志的重要性,所以还是要开启的。

二进制日志的定义:

   默认在数据文件目录data下叫做:xxx-bin.XXXXX

xxx-bin.index则是一个索引文件,记录到底现在有多少二进制文件,以及正在写哪个。

如果要自己定义的话,二进制文件路径:

       log-bin=/data/logs/binary/changelog

二进制文件索引文件修改:

       log-bin-index=/data/logs/relay/binarylog.index

四:慢查日志/查询日志:

实现定义那些执行时间超过了特定时长的查询事件。默认是10秒。默认是没有开启的。

      long_query_time =定义默认时间

      slow_query_log=是否开启慢查日志 ON OFF

      slow_query_log_file=定义慢查日志的路径及文件名

      general_log=是否开启查询日志ON/OFF

      general_log_file=查询日志的保存路径以及文件名

      log_output=将日志保存在哪

五:如何做日志滚动:

为了让日志文件保持特定大小以免超出了我们服务器响应的能力。我们要做日志滚动

   flush logs命令:手动其滚动

一般只对binary logs有用,它会将当前的二进制日志关闭,然后新生成一个新的二进制日志。对于其他的日志文件,我们完全可以手动去滚动,不需要这个命令。


六:二进制日志的删除方式:

对于慢查日志和查询日志的文件,滚动过后不想要了可以直接删除,但是对于二进制文件来说,我们不能手动实用rm命令对其进行删除。而需要使用

PURGE BINARY LOGS命令:删除一个二进制日志之前的内容

mysql> PURGE BINARY LOGS TO ‘mysql-bin.00007’;

包括00007之前的所有文件都自动给你清除。

mysql> PURGE BINARY LOGS BEFORE ‘2011-3-5 23:00:00’;

删除这个时间点之前的所有二进制日志文件

二进制日志文件默认是1G:

             max_binlog_size=可以定义默认大小。

日志的备份和恢复

对于我们Mysql的属于一个在线的数据库来讲,我们在备份的时候,可能数据也在一直被写入,而如果我们强行备份的话,可能会导致备份中存入的数据的损坏。以及数据的不一致性,所以我们要采用不同的类型进行备份:

一:备份的类型:(从对象来分)

逻辑备份(逻辑导出):备份的是数据库的逻辑结构,备份的一般都是各种逻辑语句。(比如CREATE DATABESES,INSERT之类的)也叫logical export逻辑导出。逻辑备份的力度比较小,可以做到仅仅备份一个表甚至一个表中的某些行。

物理备份(裸备份):复制对应数据库的数据文件。对于不同的数据库引擎,物理备份的方法也是不一样的,物理备份也叫裸备份。

对于MyISAM这样的没有表空间的引擎来说,物理备份的速度要远快于逻辑备份。

对于InnoDB这样的引擎来说,它直接创建了固定大小的文件,然后往里填充,物理备份就没有优势了。

逻辑备份的优点:

   1.在备份速度上两种备份要取决于不同的存储引擎

   2.物理备份的还原速度非常快。但是物理备份的最小力度只能做到表。

   3.逻辑备份保存的结构通常都是纯ASCII的,所以我们可以使用文本处理工具来处理。

   4.逻辑备份有非常强的兼容性,而物理备份则对版本要求非常高

   5.逻辑备份也对保持数据的安全性有保证。

逻辑备份的缺点:

   1.逻辑备份要对RDBMS产生额外的压力,而裸备份无压力

   2.逻辑备份的结果可能要比源文件更大。所以很多人都对备份的内容进行压缩

   3.逻辑备份可能会丢失浮点数的精度信息

二:备份的类型:(从数据集来分)

完全备份:备份所有数据

增量备份:只备份从上一次完全备份或增量备份以来所增加的数据(通过二进制日志来实现增量备份,依靠二进制文件)

差异备份:每次备份都备份从上一次完全备份以来所有新增的数据

对于Mysql来讲,我们一般都是结合用,比如完全+增量1+增量2+增量3,完全+差异,不会单独使用一种备份的。

DBA的小把戏:

在每一张表背后,在别人所有加入的字段后都加了一个timestamp。当有人改变数据的时候,则将timestamp修改为改变数据的时间,这样就可以在数据改变之后,备份一段时间的数据。

三:备份的类型:(根据服务器状态)

冷备:干净的关闭数据库,直接备份,此时可以做各种备份。

温备:服务不关闭,但是只允许查询操作,然后后台进行备份。

热备:不影响读写,服务在线的备份。

一般来讲非事务性的引擎都不支持热备份,比如MyISAM。但是热备通常是各个组织都非常需要的,所以非事物引擎都采用其他的概念,达到几乎是热备的概念,(比如LVM)。

对于事务性引擎,热备就非常简单的实现。像InnoDB来说,如果想使用干净的逻辑的热备的话,只要使用官方所提供的一个工具,就能完全达到。

四:备份都备份什么?

我们备份,一般备份以下几个部分:

   1.数据文件

   2.日志文件(比如事务日志,二进制日志)

   3.存储过程,存储函数,触发器(这类MySQL数据库)

   4.配置文件(十分重要,各个配置文件都要备份)

   5.用于实现数据库备份的脚本,数据库自身清理的Croutab等……

由于备份的机制不同,所以我们建议千万不要在一个表中混合使用数据引擎。



五:常用的备份工具

120334894.jpg

mysqldump:逻辑备份工具,可以用于所有的存储引擎,但是在任何一个存储引擎上只支持温备,如果使用INNODB的话可以支持热备,备份速度中速,还原速度非常非常慢,但是在实现还原的时候,具有很大的操作余地。具有很好的弹性。

SELECT INTO OUTFILE:MySQL的一个命令,是个逻辑备份,备份力度非常细,可以指定某个表的某些行,只支持到温备,备份速度慢,恢复速度慢,可操作性比较灵活。

mk-parallel-backup:一个perl脚本,是一个人开发的,各种mk脚本,它的主要作用是模拟了mysqldump的功能,能够实现在多颗CPU上实现并行备份的能力,比mysqldump要快一些,备份速度中等,恢复速度中等。

ibbackup:对于INNODB可以实现温备,备份和还原速度都很快,这个软件它的每服务器授权版本是5000美元……-。-

BACKUP command:这个基本上已经被废弃了。

Filesystem(copy files):复制命令,只能实现冷备,物理备份。使用归档工具,cp命令,对其进行备份的,备份速度快,还原速度几乎最快,但是灵活度很低,可以跨系统,但是跨平台能力很差。

Snapshot:基于快照(LVM,ZFS)的物理备份,速度非常快,几乎是热备。只影响数据几秒钟而已。但是创建快照的过程本身就影响到了数据库在线的使用,所以备份速度比较快,恢复速度比较快,没有什么弹性空间,而且LVM的限制:不能对多个逻辑卷同一时间进行备份,所以数据文件和事务日志等各种文件必须放在同一个LVM上。而ZFS则非常好的可以在多逻辑卷之间备份。

mysqlhostcopy:基本上属于冷备的范畴,而且只能用于MyISAM引擎,物理备份,速度比较快。


备份方式1:mysqldump的使用:

逻辑备份工具:使用SELECT语句将数据都转换出来,并将其保存成ASCII文件。

备份使用格式:mysqldump db_name tbl_name

   备份的结果要使用输出重定向的方式,保存成一个文件比如:

   mysqldump db table > /root/tb1.sql

还原的时候使用:

   mysql

   mysql> SOURCE /root/tb1.sql

它的常用选项有:

   --databases db1,db2,db3:一次备份多个数据库

   --all-databases:一次备份整个数据库上的所有数据库

   --events:备份create events创建事件

   --extended-insert:备份扩展的insert语句,恢复的时候使用一个insert语句进行插入,要比单个使用Insert速度快,默认是启用的。关闭使用 --skip-extended-insert。

--flush-logs:主要用于实现刷新日志到磁盘中去,为了保证一致性的(大多数情况下也是需要的。)

--lock-all-tables:在备份之前对所有表进行加锁(这个是必须的!)

   --lock-tables tb1,tb2:锁定某些个表(一般很少用)

   --routines:同时备份存储过程存储函数

   --triggers:备份触发器

   --single-transaction:对于InnoDB的引擎提供一个一致性的视图,然后备份。这样的备份完全是一个热备,可以不锁表的

       --master-data=n:复制的,为了能够启用实现新的复***务器。一般常用的是2.

       --no-data:偶尔有用,只备份数据库和表的定义

       --where “WHERE clause”只备份数据库中某些表或者某些行的数据

1.备份表hellodb中的表t1

mysqldump -uroot -p hellodb t1 > /root/t1.sql

       t1.sql中使用 “--” 或者使用 “/*”都是注释信息

2.恢复表hellodb中的表t1

mysql -uroot -p hellodb

3.份份数据库hellodb

mysqldump --databases hellpdb > /root/hellodb.sql

   4.恢复数据库hellodb

mysql -uroot -p

真正备份的时候,要先锁定

   mysql> FLUSH TABLES;

   mysql> FLUSH TABLES WITH READ LOCK                 ##给加锁

   mysqldump --databases hellpdb > /root/hellodb.sql  ##快速备份

   mysql> UNLOCK TABLES;                              ##解锁

5.也可以自动让其加锁,并自动备份触发器:

   mysqldump --lock-all-tables --triggers --databases hellodb > /root/hellodb.sql

备份出来之后完全可以将其压缩一下,比如用Gzip压缩

备份方式2:SELECT INTO OUTFILE:命令

用于备份某些表中的某些数据,这里备份已经要保存在/tmp下,它没有关于表格式的定义,如果用它来恢复的话,必须要确定表和表格式都已经存在.

备份格式:SELECT * INTO OUTFILE ‘/tmp/t1.txt’FROM t1;

还原格式:LOAD DATA INFILE ‘/tmp/t1.txt’INTO TABLE t1;

1.从t2表中备份所有h开头的行

mysql> SELECT * INTO OUTFILE ‘/tmp/t2.sql’FROM t2 WHERE CNAME LIKE ‘h%’

  2.还原:将表中的数据还原回来

mysql> LOAD DATA INFILE ‘/tmp/t2.sql’ INTO TABLE t3;

备份方式3:基于LVM来进行物理备份

备份这类的前提:

   1.数据文件必须在独立的LV上。

   2.对数据库中的表施加读锁。

   3.立即对数据在的LV做快照;

   4.释放数据库的读锁;

   5.挂载快照卷,备份数据文件(如果是Innodb的引擎,一定要备份事物日志)

   6.删除快照卷

对于Innodb数据引擎的备份还需要确保:

             Innodb的数据和事务日志在同一个LVM上

sync_binlog=1

log_bin=ON

innodb_support_xa=ON

使用物理备份做一次全库备份:

   mysql> FLUSH TABLES WITH READ LOCK;               ##给全表加读锁

   mysql> \q                                         ##快速退出

   lvcreate -L 50M -n mysnap -s /dev/myvg/mydata     ##快速创建快照

   mysql                                             ##快速进入Mysql

   mysql> UNLOCK TABLES;                             ##快速解锁

   mysql> \q                                         ##退出

   mount /dev/myvg/mysnap /mnt                       ##挂载快照卷

   cd /mnt  

   tar -jcf /root/mysql.tar.bz2 hellodb/ ibdata1 iblogfile* mysql-bin.*  ##使用tar压缩归档备份

   umount /mnt                                       ##卸载快照卷

   lvremove --force /dev/myvg/mysnap                 ##删除快照卷

假设内容已经都坏了,重新安装好mysql之后,将刚才的所有内容恢复回来。

先别启动mysqld

   cd /mydata/data                            ##进到目录内

   tar xf /root/mysql.tar.bz2 -C ./           ##解压归档文件

   service mysqld start                       ## 重启Mysqld

对于我们快照完之后,又新增的内容的恢复,我们就需要使用二进制日志文件来恢复了

查看二进制日志文件:mysqlbinlog

常用的选项:

--start-position:从哪个事件位置开始

      --end-position:从哪个事件结束

      --start-datetime:指定从哪个时间点开始

           --start-datatime=”2011-09-05 11:39:40”

      --stop-datetime:从哪个时间点结束

           --start-datatime=”2011-09-05 12:00:00”

二进制日志文件内容:

   at :事件开始的位置(整个mysql二进制日志中的位置)

年月日 时分秒 服务器id 下一个事件开始的位置线程号语句发生时间 执行结果 执行内容 时间戳

   SHOW BINLOG EVENTS,查看事件点

查看此时正在被使用的事物日志文件:以及下一次事件开始的时候起始的位置

   SHOW MASTER STATUS;

当我们需要单独备份一个正在使用的事件日志的时候,

SHOW MASTER STATUS;      ##查看当前事件日志

FLUSH LOGS ;             ##手动滚动日志以让其写入新的日志

此时再进行将上一个日志文件进行备份


一次完整的物理备份+基于二进制的差异备份,以及完全恢复的过程:

   mysql> FLUSH TABLES WITH READ LOCK;             ##给全表加读锁

   mysql> SHOW MASTER STATUS;                      ##记录事件日志的日志文件和时间起始位置

   mysql> \q                                       ##快速退出

   lvcreate -L 50M -n mysnap -s -p r /dev/myvg/mydata   ##快速创建快照

   mysql                                           ##快速进入Mysql

   mysql> UNLOCK TABLES;                           ##快速解锁

   mysql> \q                                       ##退出

   mount /dev/myvg/mysnap /mnt                     ##挂载快照卷

   cd /mnt  

   tar -jcf /root/mysql.tar.bz2 hellodb/ ibdata1 iblogfile*     ##使用tar压缩归档备份

   umount /mnt                                     ##卸载快照卷

   lvremove --force /dev/myvg/mysnap               ##删除快照卷

mysqlbinlog --start-position 301 mysql -bin.000006 > /root/mysql2.incr.sql     ##备份二进制文件

此时如果数据库坏了,需要全盘恢复。

   chown -R mysql .                    ##重装mysql,先修改属主

   scripts/mysql_install_db --datadir=/mydata/data/ --user=mysql  ##重装mysql,指定我们的目录

   chown -R root .                     ##重新恢复属主

   cd /mydata/data/                    ##进入工作目录

   tar xf /root/mysql2.tar.bz2 -C .    ##将备份解压至工作目录

mysql 恢复新增的二进制日志到数据库中

本文出自 “For The Dream” 博客,请务必保留此出处http://foreveryan.blog.51cto.com/3508502/658012