mysql社区版本的备份工具
一、mysqldump备份

=================================================================
=====================================================================

二、mysqlhotcopy备份
mysql社区版备份:
mysqlhotcopy使用lock tables、flush tables和cp或scp来快速备份数据库.它是备份数据库或单个表最快的途径,完全属于物理备份,但只能用于备份MyISAM存储引擎和运行在数据库目录所在的机器上.与mysqldump备份不同,mysqldump属于逻辑备份,备份时是执行的sql语句.使用mysqlhotcopy命令前需要要安装相应的软件依赖包.
只能用户myisam存储引擎,并且需要停止mysql服务,来保证数据的一致性
备份:
mysqlhotcopy -u root -p 123456 test /home/backup/test
恢复:
cp -Rf /home/backup/test /usr/local/mysql/data/
==========================================================
========================================================
三、mysqllvmbackup备份

mysqllvmbackup:可以支持任意的存储引擎,他也是拷贝系统文件的方式,他可以不停止服务来备份数据,几乎是热备份,工作原理是:
首先执行给数据库一个读锁,然后执行快照,然后释放锁,在从快照中拷贝文件:
流程如下:
1、flush tables with read lock
2、create snapshot
3、show master status
4、unlock tables
5、copy data from cow to back

6、remove snapshot


创建逻辑卷:

pvcreate /dev/sdb1
查看卷中的分区:
pvs
pvdisplay

创建卷组 vgdata ,并将刚才创建好的两个物理卷加入该卷组.可以看出默认PE大小为4MB,PE是卷组的最小存储单元.可以通过 –s参数修改大小。
vgcreate vgdata /dev/sdb1
vgdisplay

实际操作:

1、进入mysql数据库 flush tables with read lock
 
2、创建lvm快照 lvcreate -n mysql_data_back -L 100M /dev/vgdata/data,这时数据库的目录是接在/dev/vgdata/data分区上面

3、进入数据库:unlock tables
4、 mount /dev/vgdata/mysql_data5 /mnt

[root@server1 mysql]# mkdir /home/databack

[root@server1 mysql]# cp -R /mnt/* /home/databack

[root@server1 mysql]# ls /home/databack


 在规划MySQL数据库时最好将数据和日志分开放到lvm分区中。使用LVM快照备份,需要将数据放在lvm分区。

# umount /mnt         –卸载挂载设备
# lvremove /dev/GLSvg/mysql-snap    –移除快照设备


试验中因mysql数据不是放在lvm分区,所以先将数据移到lvm分区。
1.把原来存放在普通分区的数据移至LVM中
# lvcreate -n mysql_data -L 1G vgdata  –建立lvm分区
# mkfs.ext3 /dev/vgdata/mysql_data     –进行格式化

# service mysql stop –关闭Mysql服务器
# tar cjvf /opt/mysql_data.tar.bz2 . –将原来数据库的数据打成包
# rm -rf /data2/*   –删除原数据

# vim /etc/fstab   –修改文件系统挂载表
/dev/GLSvg/mysql_data   /data2                  ext3    defaults        0 0

# tar xvf mysql_data.tar.bz2 -C /data2 将原来的数据解压至新存储(LV)上

启动mysql
# cd /opt/mysql-glibc/
# ./bin/mysqld_safe –defaults-file=/data2/my.cnf &

2.为mysql_data做快照
# lvcreate -n mysql-snap -L 100M -s /dev/GLSvg/mysql_data   -s给/dev/GLSvg/mysql_data建立大小为100M的快照

#ll /dev/mysqllvm/       –查看快照设备
lv_mysqllvm  mysql-snap
 
–>mysql-snap   快照设备
–>/dev/GLSvg/mysql_data 存放原始数据的lvm分区
–>cow(copy online write) 新写入数据,数据的写入量不能超过cow设备大小,不然整个LV存储都会坏掉,移除快照设备后,cow上写入的数据将写入到原lvm分区

# ll /dev/mapper/  –查看cow设备
mysqllvm-mysql–snap
mysqllvm-mysql–snap-cow
mysqllvm-lv_mysqllvm
mysqllvm-lv_mysqllvm-real

3、从快照上做完整备份
# mount /dev/mysqllvm/mysql-snap /mnt/   –将快照设备挂载到/mnt目录
# cd /mnt         
# tar czvf /opt/mysql-snap.tar.gz ./  –备份快照上文件

4、删除快照
# umount /mnt         –卸载挂载设备
# lvremove /dev/GLSvg/mysql-snap    –移除快照设备

5、从快照上还原数据:
# mysqladmin -uroot -p147258369 shutdown  –关闭mysql服务器
# rm -rf /data2/*   –删除原Lvm上的所有数据
# tar xvf mysql-snap.tar.gz -C /data2 –还原数据
# cd /opt/mysql-glibc/   –进入到mysql安装目录
# ./bin/mysqld_safe –defaults-file=/data2/my.cnf &

快照后新的操作使用binlog日志进行恢复。

注意:使用LVM快照需要进行锁表和解锁

mysql> flush tables with read lock;   –锁表

mysql> unlock tables;  —解锁


lvm的扩容

LVM (Logic Volume Management,逻辑卷管理),是传统商业Unix就带有的一项高级磁盘管理工具,异常强大。后来LVM移植到了Linux操作系统上,尽管不像原来Unix版本那么强大,但瘦死的骆驼比马大,Linux的LVM仍然非常强大,可以在生产运行系统上面直接在线扩展硬盘分区,可以把分区umount以后收缩分区大小,还可以在系统运行过程中把一个分区从一块硬盘搬到另一块硬盘上面去等等,简直就像变魔术,而且这一切都可以在一个繁忙运行的系统上面直接操作,不会对你的系统运行产生任何影响,很安全。
还是拿JavaEye的网站服务器随便举个小例子吧。话说今天晚上我登录JavaEye网站服务器随便这么一查看磁盘使用状况:
C代码  收藏代码

    df -h  


竟然发现/home分区的磁盘消耗的很快
C代码  收藏代码

    Filesystem                Size  Used  Avail Use%   Mounted on  
    /dev/mapper/system-home    40G   32G    8G  80%    /home  


有点出乎意料,已经使用了80%,如果用光了,可就有点麻烦了,所以为了安全,把/home分区扩大5GB,多给它点硬盘空间,敲入两条shell命令

C代码  收藏代码

    lvextend -L +5G /dev/system/home  
    resize_reiserfs -s +5G /dev/system/home   


先把逻辑卷扩大5GB,再把上面的reiserfs文件系统扩大5GB,前后耗时不超过3秒钟。再df -h查看一下:
C代码  收藏代码

    Filesystem                Size  Used  Avail Use%   Mounted on  
    /dev/mapper/system-home    45G   32G    13G  71%    /home  


哈哈,/home立刻多了5GB,搞定收工,这是不是很像变戏法,我没停任何服务,没重起服务器,大家没有任何感觉,就一切搞定,说实话我也一直觉得LVM很cool,所以我一直是LVM+Reiserfs的忠实拥趸。有兴趣学习LVM的同学可以下载后面的附件,这可是我珍藏多年的LVM秘籍!

====================================
mysql企业版本的备份工具
xtrabackup,热备份 增量备份
一、xtrabackup的安装:
1、新增yum源

vi percona.repo

[percona]

name = CentOS $releasever - Percona

baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/

enabled = 1

gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona

gpgcheck = 1


2、安装:
yum -y install percona-xtrabackup
如果机子已经安装了相应扩展,但是包扩展错误就可以使用
yum -y install percona-xtrobackup,即可安装成功


2.1 全量备份:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /home/back/
该语句将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下(/backup/mysql/data),注意:如果不指定--defaults-file,默认值为/etc/my.cnf。
备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/backup/mysql/data

2.2 全量恢复:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --use-memory=1G --apply-log /home/back/2016-05-23_10-05-45
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /home/back/2016-05-23_10-05-45

恢复分为两个步骤,
第1步是apply-log,为了加快速度,一般建议设置--use-memory,这个步骤完成之后,目录/home/back/2016-05-23_10-05-45下的备份文件已经准备就绪。
第2步是copy-back,即把备份文件拷贝至原数据目录下。
恢复完成之后,一定要记得检查数据目录的所有者和权限是否正确

2.3 增量备份:

增量备份需要基于全备,先假设我们已经有了一个全备(/home/back/2016-05-23_10-05-45),在该全表的基础上做增量备份。

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental-basedir=/home/back/2016-05-23_10-05-45 --incremental /home/back/iback

其中--incremental-basedir指向全备目录,--incremental指向增量备份的目录。
上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录(本例中为:/home/back/iback/2016-05-23_10-23-33),在该目录下存放着增量备份的所有文件。
备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:

注意:

在全量备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:
[plain]
backup_type = full-backuped
from_lsn = 0
to_lsn = 563759005914
last_lsn = 563759005914
基于该全备的增量备份的信息如下:
[plain]
backup_type = incremental
from_lsn = 563759005914
to_lsn = 574765133284
last_lsn = 574765133284
从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。
那么,我们是否可以在增量备份的基础上再做增量备份呢?答案是肯定的,只要把--incremental-basedir执行上一次增量备份的目录即可,如下所示:
[plain]
再次增量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental-basedir=/home/back/iback/2016-05-23_10-23-33 --incremental /home/back/iback/

它的xtrabackup_checkpoints记录着备份信息如下:
[plain]
backup_type = incremental
from_lsn = 574765133284
to_lsn = 574770200380
last_lsn = 574770200950
可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。

2.4 恢复:
增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志,如:
[plain]
innobackupex --apply-log --redo-only BASE-DIR
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。
这里要注意的是:最后一步的增量备份并没有--redo-only选项!还有,可以使用--use_memory提高性能。
以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。
第一步完成之后,我们开始第二步:回滚未完成的日志:
[plain]
innobackupex --apply-log BASE-DIR
上面执行完之后,BASE-DIR里的备份文件已完全准备就绪,最后一步是拷贝:
[plain]
innobackupex --copy-back BASE-DIR
同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。
常见错误及解决方法