######安装编译环境
[root@localhost ~]# yum -y groupinstall "Server Platform Development" "Development tools"
######安装编译工具
[root@localhost ~]# yum install -y cmake
######创建Mysql用户
[root@localhost ~]# useradd -r mysql
######解压并安装Mysql
[root@localhost ~]# tar xf mysql-5.5.33.tar.gz
[root@localhost ~]# cd mysql-5.5.33
[root@localhost mysql-5.5.33]# cmake . \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装路径
> -DMYSQL_DATADIR=/mydata/data \ #数据存放路径
> -DSYSCONFDIR=/etc \ #主配置文件目录
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #下面三项启用支持的存储引擎
> -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITH_READLINE=1 \ #支持readline库
> -DWITH_SSL=system \ #支持SSL加密
> -DWITH_ZLIB=system \ #支持ZLIB压缩
> -DWITH_LIBWRAP=0 \ #支持Libwrap库
> -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ #Sock文件路径
> -DDEFAULT_CHARSET=utf8 \ #默认字符集
> -DDEFAULT_COLLATION=utf8_general_ci #默认字符集排序规则
######编译并安装
[root@localhost mysql-5.5.33]# make && make install
注释: 如果想清理此前的编译所生成的文件,则需要使用如下命令
make clean
rm CMakeCache.txt
2、为Mysql提供主配置文件与Sysv服务脚本
######为Mysql提供主配置文件
[root@localhost mysql-5.5.33]# cp support-files/my-large.cnf /etc/my.cnf
######为Mysql提供Sysv服务脚本
[root@localhost mysql-5.5.33]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
######赋于Sysv脚本执行权限
[root@localhost mysql-5.5.33]# chmod +x /etc/rc.d/init.d/mysqld
######将Mysqld加入系统服务
[root@localhost mysql-5.5.33]# chkconfig --add mysqld
[root@localhost mysql-5.5.33]# chkconfig mysqld on
3、让系统识别源码包安装的软件
[root@localhost mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@localhost mysql]# . /etc/profile
[root@localhost mysql]# ln -s /usr/local/mysql/include /usr/include/mysql
[root@localhost ~]# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf
[root@localhost ~]# ldconfig
4、修改Mysql主配置文件
[root@localhost mysql]# vim /etc/my.cnf
datadir = /mydata/data #添加此行,数据存放目录
innodb_file_per_table = 1 #启用InnoDB表每表一个文件,默认所有数据库使用一个表空间
log-bin=/binlog/mysql-bin #修改二制作存放目录
5、为Mysql创建数据库与二进制存放目录
######创建数据、二进制存放目录与备份目录
[root@localhost ~]# mkdir -p /backup /mydata/data /binlog
######修改Mysql二进制与数据及备份目录的属主、属组为Mysql用户
[root@localhost mysql]# chown -R mysql.mysql /mydata/data
[root@localhost mysql]# chown -R mysql.mysql /binlog /backup
######修改Mysql安装目录的属组为Mysql组
[root@localhost mysql]# chown -R :mysql *
6、初始化Mysql并启动服务
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[root@localhost ~]# service mysqld start
Starting MySQL......... SUCCESS!
######修改Mysql的root用户密码
[root@localhost ~]# mysqladmin -uroot password 'root@pass'
7、创建测试数据库与表并插入数据
[root@localhost ~]# mysql -uroot -proot@pass
mysql> create database allen;
mysql> use allen;
mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');
[root@localhost ~]# mysqldump -uroot -proot@pass --lock-all-tables --routines --events --triggers --master-data=2 --flush-logs --databases allen > /backup/allen_`date +%F`.sql
注释:
-u #指定用户名
-p #指定用户密码
-h #指定主机地址
-A|--all-databases #备份所有数据库
--databases #备份指定数据库
--single-transcation #基于此项可以实现对InnoDB表做热备份,但不需要使用
--lock-all-tables #执行备份时为所有表请求加锁
-E|--events #备份事件调度器代码
--opt #同时启动各种高级选项
-R|--routines #备份存储过程和存储函数
--flush-logs #备份之前刷新日志
--triggers #备份触发器
--master-data=2 #该选项将会记录binlog的日志位置与文件名并追加到文件中,如果为1将会输出CHANGE MASTER命令,主从下有用
######更多选项请参考man手册
2、备份二进制日志文件并查看已备份的数据文件
[root@localhost ~]# cp /binlog/mysql-bin.00000* /backup/
[root@localhost ~]# ls /backup/
allen_2013-09-06.sql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.000004
3、在"allen"数据库中新添加数据来模拟做增量备份,并查看当前日志文件及所处位置
mysql> create table tab2 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab2 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F');
mysql> show master status; #查看二进制日志文件所处位置
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 1289 | | |
+------------------+----------+--------------+------------------+
4、做增量备份,基于上一次完全备份到目前日志所处的位置
######查看数据库备份的二进制日志
[root@localhost ~]# less /backup/allen_2013-09-06.sql
######从下面可以看出二进制日志文件及完全备份后日志所处位置"107"
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=107;
######基于二进制日志做增量备份,
[root@localhost ~]# mysqlbinlog --start-position=107 /binlog/mysql-bin.000004 > /backup/allen_incremental.sql
注释:
--start-position #指定从哪个位置开始导出二进制日志
--stop-position #指定到哪个位置结束;如果到最后可以不用指定
--start-datetime #指定从哪个时间开始 时间格式:"2013-09-06 14:50:26"
--stop-datetime #指定到哪个时间结束
5、向"allen"数据库新添加两条记录,然后模拟误操作把数据库删除了,怎么恢复到当前数据
mysql> insert into tab2 (Name,Age,Gender) values ('Zhu BaJie',26,'M'),('Sun WuKong',24,'F');
mysql> drop database allen;
mysql> show master status; #查看二进制文件及所处位置
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 1644 | | |
+------------------+----------+--------------+------------------+
6、恢复数据到当前数据,需要恢复完整备份+增量备份+增量备份后删除之前的二进制文件
######查看二进制文件,下面可以看出删除操作是在"1561"时做的
[root@localhost ~]# mysqlbinlog /binlog/mysql-bin.000004
# at 1561
#130906 5:31:04 server id 1 end_log_pos 1644 Query thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1378416664/*!*/;
drop database allen
######导出删除之前至增量备份后的二进制日志数据
[root@localhost ~]# mysqlbinlog --start-position=1289 --stop-position=1561 /binlog/mysql-bin.000004 > /backup/allen_1561.sql
[root@localhost ~]# mysql -uroot -proot@pass
mysql> set global sql_log_bin=0; #关闭二进制日志记录,因为恢复数据对我们来说记录没有意义
mysql> source /backup/allen_2013-09-06.sql #恢复完整备份
mysql> source /backup/allen_incremental.sql #恢复增量备份
mysql> source /backup/allen_1561.sql #恢复增量后至删除前的数据
mysql> set global sql_log_bin=1; #开启二进制日志记录
mysql> use allen; #切换到"allen"数据库
mysql> show tables; #查看数据表已经恢复
+-----------------+
| Tables_in_allen |
+-----------------+
| tab1 |
| tab2 |
+-----------------+
mysql> select * from tab1; #查看表内数据也已经完全恢复
+----+------------+------+--------+
| ID | Name | Age | Gender |
+----+------------+------+--------+
| 1 | Zhang WuJi | 26 | M |
| 2 | Zhao Min | 24 | F |
+----+------------+------+--------+
mysql> select * from tab2;
+----+--------------+------+--------+
| ID | Name | Age | Gender |
+----+--------------+------+--------+
| 1 | Liang ShanBo | 26 | M |
| 2 | Zhu YingTai | 24 | F |
| 3 | Zhu BaJie | 26 | M |
| 4 | Sun WuKong | 24 | F |
+----+--------------+------+--------+
######分区,不做详细介绍
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
p
Partition number (1-4): 1
First cylinder (1-7832, default 1):
Last cylinder, +cylinders or +size{K,M,G} (1-7832, default 7832): +10G
Command (m for help): n
p
Partition number (1-4): 2
First cylinder (1307-7832, default 1307):
Last cylinder, +cylinders or +size{K,M,G} (1307-7832, default 7832): +10G
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sdb1 1 1306 10490413+ 8e Linux LVM
/dev/sdb2 1307 2612 10490445 8e Linux LVM
Command (m for help): w
######让内核重新读取分区表,如果读取不到需要重启
[root@localhost ~]# partx /dev/sdb
######创建逻辑卷并挂载,不做详细介绍
[root@localhost ~]# pvcreate /dev/sdb{1,2}
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# vgcreate myvg /dev/sdb{1,2}
Volume group "myvg" successfully created
[root@localhost ~]# lvcreate -L +10G -n mylv myvg
Logical volume "mylv" created
[root@localhost ~]#
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv[root@localhost ~]# mkdir /mydata /backup
[root@localhost ~]# vim /etc/fstab
/dev/myvg/mylv /mydata ext4 defaults 0 0
[root@localhost ~]# mount -a
######创建Mysql数据与二进制日志存放目录并修改权限
[root@localhost ~]# mkdir /mydata/{data,binlog}
[root@localhost ~]# chown -R mysql:mysql /mydata/*
2、修改Mysql主配置文件数据存放目录与二进制文件存放目录并初始化
[root@localhost ~]# vim /etc/my.cnf
datadir = /mydata/data
log-bin=/mydata/binlog/mysql-bin
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@localhost mysql]# service mysqld start
Starting MySQL... SUCCESS!
3、创建数据库并添加数据
mysql> create database allen;
mysql> use allen;
mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');
4、登录Mysql数据库,请求为所有表加锁,记得一定不要关闭终端,否则表锁将会失效,并滚动日志
mysql> flush tables with read lock; #为所有表请求加锁
mysql> flush logs; #刷新日志
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 107 | | |
+------------------+----------+--------------+------------------+
5、另外迅速开启一个终端窗口,为逻辑卷创建快照;逻辑卷:"/dev/myvg/mylv"
[root@localhost ~]# lvcreate -L 500M -s -p r -n mylv-snap /dev/myvg/mylv
Logical volume "mylv-snap" created
6、快照做完后,快速释放读锁
mysql> unlock tables;
7、挂载快照卷,备份出数据,卸载快照卷并删除
[root@localhost ~]# mount /dev/myvg/mylv-snap /mnt/
mount: block device /dev/mapper/myvg-mylv--snap is write-protected, mounting read-only
[root@localhost ~]# cp -rp /mnt/* /backup/
[root@localhost ~]# umount /mnt/
######删除快照卷
[root@localhost ~]# lvremove /dev/myvg/mylv-snap
Do you really want to remove active logical volume mylv-snap? [y/n]: y
Logical volume "mylv-snap" successfully removed
这样一次完整的LVM完全备份就算是完成了,下面我们来测试一下是否能正常使用
8、停止Mysql服务,删除数据目录下的所有文件来模拟数据库损坏;并恢复数据
[root@localhost ~]# service mysqld stop
Shutting down MySQL... SUCCESS!
[root@localhost ~]# rm -rf /mydata/*
######恢复已备份的数据
[root@localhost ~]# cp -rp /backup/* /mydata/
######启动Mysql服务
[root@localhost ~]# service mysqld start
Starting MySQL SUCCESS!
注释:如果不能启动,请检查数据目录权限;属主、属组是否为Mysql用户
9、登录Mysql服务器,验证数据是否恢复
mysql> select * from allen.tab1; #数据已经成功恢复
+----+------------+------+--------+
| ID | Name | Age | Gender |
+----+------------+------+--------+
| 1 | Zhang WuJi | 26 | M |
| 2 | Zhao Min | 24 | F |
+----+------------+------+--------+
[root@localhost ~]# yum -y install mylvmbackup-0.14-0.noarch.rpm
[root@localhost ~]# rpm -ql mylvmbackup
/etc/mylvmbackup.conf #主配置文件
/usr/bin/mylvmbackup #执行程序
4、主配置文件介绍
[root@localhost ~]# vim /etc/mylvmbackup.conf
[mysql] #连接数据库配置
user=root
password=root@pass
host=localhost
port=3306
socket=/tmp/mysql.sock
mycnf=/etc/my.cnf
[lvm] #LVM逻辑卷的配置
vgname=myvg #卷组名称
lvname=mylv #逻辑卷名称
backuplv=mysql_snap #快照卷名称
lvsize=5G
[fs] #文件系统配置
xfs=0
mountdir=/mnt #挂载目录
backupdir=/backup #备份目录,也可以备份到行程主机
[misc] #定义备份选项
backuptype=tar #定义备份的类型
backupretention=0
prefix=backup #定义备份文件名前缀
suffix=_mysql #定义备份文件名后缀
tararg=cvf #定义tar参数,默认为cvf
tarfilesuffix=.tar.gz #定义备份文件后缀名格式
datefmt=%Y%m%d_%H%M%S #定义备份文件名时间戳格式
keep_snapshot=0 #是否保留snaphot
keep_mount=0 #是否卸载snaphot
quiet=0 #定义记录日志类型
注释:其他配置保持输入即可
5、备份数据库并验证备份文件
[root@localhost ~]# mylvmbackup
######出现以下信息表示备份成功,下面意思是删除快照卷成功
20130906 11:55:33 Info: Running: lvremove -f /dev/myvg/mysql_snap
Logical volume "mysql_snap" successfully removed
20130906 11:55:34 Info: DONE: Removing snapshot
######查看备份文件,已经成功备份
[root@localhost ~]# ls /backup/
backup-20130906_115532_mysql.tar.gz
[root@localhost ~]# yum -y install percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
[root@localhost ~]# mysql -uroot -proot@pass
mysql> create user 'backup'@'localhost' identified by 'mypass'; #创建用户并设置密码
mysql> revoke all privileges,grant option from 'backup'@'localhost';#去掉用户的所有默认权限
mysql> grant reload,lock tables,replication client,event on *.* to 'backup'@'localhost'; #重新为用户授权
mysql> flush privileges; #刷新使其重新授权表
注释: 用户授权规则为最小权限
3、完全备份:
[root@localhost ~]# innobackupex --user=backup --password=mypass /backup/
######下面表示已经备份成功
innobackupex: Backup created in directory '/backup/2013-09-06_07-47-33'
innobackupex: MySQL binlog position: filename 'mysql-bin.000005', position 744
130906 07:47:36 innobackupex: Connection to database server closed
130906 07:47:36 innobackupex: completed OK!
######为防止意外错误,先关闭Mysql服务
[root@localhost ~]# service mysqld stop
Shutting down MySQL. SUCCESS!
######删除数据目录下的所有文件
[root@localhost ~]# rm -rf /mydata/data/*
######准备一个完全备份
[root@localhost ~]# innobackupex --apply-log /backup/2013-09-06_07-47-33/
######出现以下信息表示已经成功
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
130906 8:26:36 InnoDB: Starting shutdown...
130906 8:26:40 InnoDB: Shutdown completed; log sequence number 1603596
130906 08:26:40 innobackupex: completed OK!
注释:
--apply-log #作用是把备份时没有提交的事务回滚,已经提交的事务同步的数据文件中
[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/
######出现以下提示表示已经恢复成功
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2013-09-06_07-47-33'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130906 08:40:24 innobackupex: completed OK!
注释:
--copy-back #用于恢复操作,通过复制所有数据相关的文件至Mysql服务器的数据目录来执行恢复过程
6、验证是否已经成功恢复
[root@localhost ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@localhost ~]# mysql -uroot -proot@pass
mysql> select * from allen.tab1; #已经成功恢复数据
+----+------------+------+--------+
| ID | Name | Age | Gender |
+----+------------+------+--------+
| 1 | Zhang WuJi | 26 | M |
| 2 | Zhao Min | 24 | F |
+----+------------+------+--------+
注释:如果启动不成功,请查看数据目录下文件属主、属组权限是否为Mysql用户
7、使用"innobackupex"做增量备份,首先需要添加几条数据到数据库中
[root@localhost ~]# mysql -uroot -proot@pass
mysql> use allen;
mysql> insert into tab1 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F'),('BaJie',500,'M'),('WuKong',800,'M');
8、进行增量备份
######创建增量备份存储目录
[root@localhost ~]# mkdir /incremental
######执行增量备份
[root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/backup/2013-09-06_07-47-33/
######出现以下信息表示已经成功
innobackupex: Backup created in directory '/incremental/2013-09-06_09-08-16'
innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 420
130906 09:08:20 innobackupex: Connection to database server closed
130906 09:08:20 innobackupex: completed OK!
注释:
--incremental #指定增量备份数据存放目录
--incremental-basedir=DIR #指定上一次备份所在的目录
9、再添加一些数据进行增量备份
[root@localhost ~]# mysql -uroot -proot@pass
mysql> use allen;
mysql> insert into tab1 (Name,Age,Gender) values ('Guan Yin',26,'M'),('Ru Lai',24,'F');
######再次做增量备份是基于上一次增量备份来做
[root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/incremental/2013-09-06_09-08-16/
######增量备份成功
innobackupex: Backup created in directory '/incremental/2013-09-06_09-17-49'
innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 687
130906 09:17:52 innobackupex: Connection to database server closed
130906 09:17:52 innobackupex: completed OK!
[root@localhost ~]# service mysqld stop
[root@localhost ~]# rm -rf /mydata/data/*
######准备第一个备份文件为完全备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/
######准备第二个增量备份文件基于完全备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-08-16/
######准备第二个增量备份文件基于完全备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-17-49/
注释:需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”,“重放”之后,所有的备份数据将合并到完全备份上;如果有更多的增量备份文件,依次如此,一个一个的合并到完全备份上
--redo-only #作用是备份时提交的但还在事务日志中的应用到数据文件,但是还没有提交的并不回流
--incremental-dir=DIR #指定恢复的增量备份目录,这个选项会使增量备份文件中的数据合并到完全备份
11、恢复数据并启动Mysql服务验证
[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/
######恢复成功
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2013-09-06_07-47-33'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130906 09:53:33 innobackupex: completed OK!
[root@localhost ~]# chown -R mysql:mysql /mydata/data/*
[root@localhost ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@localhost ~]# mysql -uroot -proot@pass
mysql> select * from allen.tab1; #数据已经成功恢复
+----+--------------+------+--------+
| ID | Name | Age | Gender |
+----+--------------+------+--------+
| 1 | Zhang WuJi | 26 | M |
| 2 | Zhao Min | 24 | F |
| 3 | Liang ShanBo | 26 | M |
| 4 | Zhu YingTai | 24 | F |
| 5 | BaJie | 255 | M |
| 6 | WuKong | 255 | M |
| 7 | Guan Yin | 26 | M |
| 8 | Ru Lai | 24 | F |
+----+--------------+------+--------+
这里就不在演示备份完成后Mysql出现问题,其操作与恢复流程与使用"mysqldump"备份工具一样,使用完全备份+完全备份后到现在所有的增量备份+最后一次做增量备份到当前时间的二进制日志文件进行恢复;使用二进制恢复时,请找好二进制日志到上一次备份的位置,避免不必要的错误发生;然后使用"mysqlbinlog"导出并使用批处理的方式导入数据库!!!