MYSQL教程mysql备份的三种方式详解
《MYSQL教程mysql备份的三种方式详解》要点: MYSQL必读一、备份的目的 MYSQL必读做灾难恢复:对损坏的数据进行恢复和还原 MYSQL必读二、备份需要考虑的问题 MYSQL必读可以容忍丢失多长时间的数据; MYSQL必读三、备份的类型 MYSQL必读1、根据是否需要数据库离线 MYSQL必读冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行; MYSQL必读注: MYSQL必读1、这种类型的备份,取决于业务的需求,而不是备份工具 MYSQL必读2、根据要备份的数据集合的范围 MYSQL必读3、根据备份数据或文件 MYSQL必读物理备份:直接备份数据文件 MYSQL必读优点: MYSQL必读备份和恢复操作都比较简单,能够跨mysql的版本, MYSQL必读建议: MYSQL必读不要假设备份一定可用,要测试 MYSQL必读优点: MYSQL必读恢复简单、 MYSQL必读缺点: MYSQL必读备份或恢复都需要mysql服务器进程参与 MYSQL必读四:备份的对象 MYSQL必读1、 数据; MYSQL必读五、备份和恢复的实现 MYSQL必读1、利用select into outfile实现数据的备份与还原 mysql> use hellodb;???? //打开hellodb库 mysql> select * from students;? 查看students的属性 mysql> select * from students where Age > 30 into outfile ‘/tmp/stud.txt' ;?? //将年龄大于三十的同学的信息备份出来 MYSQL必读注意: MYSQL必读备份的目录路径必须让当前运行mysql服务器的用户mysql具有访问权限 MYSQL必读备份完成之后需要把备份的文件从tmp目录复制走,要不就失去备份的目的了 MYSQL必读回到tmp目录下查看刚才备份的文件 MYSQL必读[root@www ~]# cd /tmp MYSQL必读[root@www tmp]# cat stud.txt MYSQL必读3Xie Yanke53M216 MYSQL必读4Ding Dian32M44 MYSQL必读6Shi Qing46M5N MYSQL必读13Tian Boguang33M2N MYSQL必读25Sun Dasheng100MNN MYSQL必读[root@www tmp]# MYSQL必读你会发现是个文本文件.所以不能直接导入数据库了.需要使用load data infile 恢复 MYSQL必读回到mysql服务器端,删除年龄大于30的用户,模拟数据被破坏 MYSQL必读mysql> delete from students where Age > 30; MYSQL必读mysql> load data infile '/tmp/stud.txt' into table students; MYSQL必读2、利用mysqldump工具对数据进行备份和还原 MYSQL必读mysqldump 常用来做温备,所以我们首先需要对想备份的数据施加读锁, MYSQL必读2.1 施加读锁的方式: MYSQL必读1.直接在备份的时候添加选项 MYSQL必读--lock-all-tables 是对要备份的数据库的所有表施加读锁 MYSQL必读--lock-table 仅对单张表施加读锁,即使是备份整个数据库,它也是在我们备份某张表的时候才对该表施加读锁,因此适用于备份单张表 MYSQL必读2、在服务器端书写命令, MYSQL必读mysql> flush tables with read lock; 施加锁,表示把位于内存上的表统统都同步到磁盘上去,然后施加读锁 MYSQL必读mysql> flush tables with read lock;释放读锁 MYSQL必读但这对于InnoDB存储引擎来讲,虽然你也能够请求道读锁,但是不代表它的所有数据都已经同步到磁盘上,因此当面对InnoDB的时候,我们要使用mysql> show engine innodb status; 看看InnoDB所有的数据都已经同步到磁盘上去了,才进行备份操作. MYSQL必读2.2备份的策略: MYSQL必读完全备份+增量备份+二进制日志 MYSQL必读演示备份的过程; MYSQL必读2.3 先给数据库做完全备份: 代码如下:[root@www ~]# mysqldump -uroot --single-transaction --master-data=2 --databases hellodb > /backup/hellodb_`date +%F`.sql --single-transaction: 基于此选项能实现热备InnoDB表;因此,不需要同时使用--lock-all-tables; --master-data=2? 记录备份那一时刻的二进制日志的位置,并且注释掉,1是不注释的 --databases hellodb 指定备份的数据库 MYSQL必读然后回到mysql服务器端, MYSQL必读2.4回到mysql服务器端更新数据 代码如下:mysql> create table tb1(id int); 创建表 mysql> insert into tb1 values (1),(2),(3);? 插入数据,这里只做演示,随便插入了几个数据 MYSQL必读2.5先查看完全备份文件里边记录的位置: 代码如下: [root@www backup]# cat hellodb_2013-09-08.sql | less-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013',MASTER_LOG_POS=15684; 记录了二进制日志的位置 MYSQL必读2.6 在回到服务器端: 代码如下:mysql> show master status; 显示此时的二进制日志的位置 ?从备份文件里边记录的位置到我们此时的位置,即为增量的部分 +------------------+----------+--------------+------------------+ | File???????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 |????? 15982 |????????????? |????????????????? | +------------------+----------+--------------+------------------+ MYSQL必读2.7做增量备份 代码如下:[root@www backup]# mysqlbinlog --start-position=15694 --stop-position=15982 /mydata/data/mysql-bin.000013 > /backup/hellodb_`date +$F_%H`.sql MYSQL必读2.8再回到服务器 代码如下:mysql> insert into tb1 values (4),(5); 在插入一些数值 mysql> drop database hellodb;?? 删除hellodb库 MYSQL必读2.9导出这次得二进制日志: 代码如下:[root@www backup]# mysqlbinlog --start-position=15982 /mydata/data/mysql-bin.000013 查看删除操作时二进制日志的位置 [root@www backup]# mysqlbinlog --start-position=15982 --stop-position=16176 /mydata/data/mysql-bin.000013 > /tmp/hellodb.sql? //导出二进制日志 MYSQL必读2.10先让mysql离线 MYSQL必读回到服务器端: 代码如下:mysql> set sql_log_bin=0;? 关闭二进制日志 mysql> flush logs; 滚动下日志 MYSQL必读2.11模拟数据库损坏 代码如下: mysql> drop database hellodb;MYSQL必读2.12开始恢复数据: 代码如下:[root@www ]# mysql < /backup/hellodb_2013-09-08.sql? //导入完全备份文件 [root@www ]# mysql < /backup/hellodb_2013-09-08_05.sql //导入增量备份文件 [root@www ]# mysql< hellodb.sql //导入二进制文件 MYSQL必读验证完成,显示结果为我们预想的那样 MYSQL必读注: MYSQL必读1、真正在生产环境中,我们应该导出的是整个mysql服务器中的数据,而不是单个库,因此应该使用--all-databases MYSQL必读3.1策略: MYSQL必读完全备份+二进制日志; MYSQL必读3.2准备: MYSQL必读注:事务日志必须跟数据文件在同一个LV上; MYSQL必读3.3创建lvm Lvm的创建这里就不多说了,想了解话点击/LINUXjishu/105937.html MYSQL必读3.4 修改mysql主配置文件存放目录内的文件的权限与属主属组,并初始化mysql 代码如下:[root@www ~]# mkdir /mydata/data???????????? //创建数据目录 [root@www ~]# chown mysql:mysql /mydata/data? //改属组属主 [root@www ~]# [root@www ~]# cd /usr/local/mysql/??? //必须站在此目录下?????? [root@www mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data? //初始化mysql MYSQL必读3.5修改配置文件: 代码如下:vim /etc/my.cof datadir=/mydata/data?? 添加数据目录 sync_binlog = 1? 开启此功能 MYSQL必读3.6 启动服务 代码如下:[root@www mysql]# service mysqld start mysql> set session sql_log_bin=0;? 关闭二进制日志 mysql> source /backup/all_db_2013-09-08.sql?? 读取备份文件 MYSQL必读3.7回到mysql服务器: 代码如下:mysql> FLUSH TABLES WITH READ LOCK; 请求读锁 注:不要退出,另起一个终端: mysql> SHOW MASTER STATUS;????????? 查看二进制文件的位置 +------------------+----------+--------------+------------------+ | File???????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 |????? 107 |????????????? |????????????????? | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) mysql> FLUSH LOGS;? 建议滚动下日志.这样备份日志的时候就会很方便了 MYSQL必读3.8导出二进制文件,创建个目录单独存放 代码如下:[root@www ~]# mkdir /backup/limian [root@www ~]# mysql -e 'show master status;' > /backup/limian/binlog.txt [root@www ~]# MYSQL必读3.9为数据所在的卷创建快照: 代码如下: [root@www ~]# lvcreate -L 100M -s -p r -n mysql_snap /dev/myvg/mydataMYSQL必读回到服务器端,释放读锁 代码如下:mysql> UNLOCK TABLES; [root@www ~]# mount /dev/myvg/mysql_snap /mnt/data [root@www data]# cp * /backup/limian/ [root@www data]#lvremove /dev/myvg/mylv_snap MYSQL必读3.10更新数据库的数据,并删除数据目录先的数据文件,模拟数据库损坏 代码如下:mysql>? create table limiantb (id int,name CHAR(10)); mysql> insert into limiantb values (1,'tom'); [root@www data]# mysqlbinlog --start-position=187 mysql-bin.000003 > /backup/limian/binlog.sql [root@www backup]# cd /mydata/data/ [root@www data]#? rm -rf * [root@www ~]# cp -a /backup/limian/* /mydata/data/ [root@www data]# chown mysql:mysql * MYSQL必读3.11测试 MYSQL必读启动服务 代码如下:[root@www data]# service mysqld start [root@www data]# mysql 登陆测试 mysql> SHOW DATABASES; mysql> SET sql_log_bin=0 mysql> source/backup/limian/binlog.sql; #二进制恢复 mysql> SHOW TABLES;???????? #查看恢复结果 mysql> SET sql_log_bin=1;?? #开启二进制日志 MYSQL必读注:此方式实现了接近于热备的方式备份数据文件,而且数据文件放在lvm中可以根据数据的大小灵活改变lvm的大小,备份的方式也很简单. MYSQL必读4、基于Xtrabackup做备份恢复 MYSQL必读官方站点:www.percona.com MYSQL必读优势: MYSQL必读1、快速可靠的进行完全备份 MYSQL必读安装Xtrabackup 代码如下:[root@www ~]# rpm -ivh percona-xtrabackup-2.1.4-656.rhel6.i686.rpm MYSQL必读其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得 MYSQL必读注意:在备份数据库的时候,我们应该具有权限,但需要注意的是应该给备份数据库时的用户最小的权限,以保证安全性, MYSQL必读4.1前提: MYSQL必读应该确定采用的是单表一个表空间,否则不支持单表的备份与恢复. MYSQL必读innodb_file_per_table = 1 MYSQL必读4.2备份策略 [root@www ~]# makdir /innobackup MYSQL必读4.4做完全备份: 代码如下:[root@www ~]# innobackupex --user=root --password=mypass /innobackup/ MYSQL必读注: MYSQL必读1、只要在最后一行显示 innobackupex: completed OK!,就说明你的备份是正确的. MYSQL必读[root@www 2013-09-12_11-03-04]# ls MYSQL必读4.5回到mysql服务器端对数据进行更新操作 代码如下:mysql> use hellodb; mysql> delete from students where StuID>=24; MYSQL必读4.6增量备份 代码如下:innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/2013-09-12_11-03-04/ --incremental? 指定备份类型 --incremental-basedir= 指定这次增量备份是基于哪一次备份的,这里是完全备份文件,这样可以把增量备份的数据合并到完全备份中去 MYSQL必读4.7第二次增量 MYSQL必读先去修改数据 代码如下:mysql> insert into students (Name,Age,Gender,ClassID,TeacherID) values ('tom',33,'M',2,4); innobackupex --user=root --password=mypass --incremental /innobackup/ --incremental-basedir=/innobackup/2013-09-12_11-37-01/ ?这里只须要把最后的目录改为第一次增量备份的数据目录即可 MYSQL必读4.8最后一次对数据更改但是没做增量备份 代码如下: mysql> delete from coc where id=14;MYSQL必读4.9把二进制日志文件备份出来,(因为最后一次修改,没做增量备份,要依赖二进制日志做时间点恢复) 代码如下: [root@www data]# cp mysql-bin.000003 /tmp/MYSQL必读4.10模拟数据库崩溃 代码如下:[root@www data]# service mysqld stop [root@www data]# rm -rf * MYSQL必读恢复前准备 MYSQL必读4.11对完全备份做数据同步 代码如下: [root@www ~]# innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/MYSQL必读4.12对第一次增量做数据同步 代码如下:innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/ --incremental-basedir=/innobackup/2013-09-12_11-37-01/ MYSQL必读4.13对第二次增量做数据同步 代码如下:innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/ --incremental-basedir=/innobackup/2013-09-12_11-45-53/ --apply-log 的意义在于把备份时没commit的事务撤销,已经commit的但还在事务日志中的应用到数据库 MYSQL必读注: MYSQL必读对于xtrabackup来讲,它是基于事务日志和数据文件备份的,备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据库文件中的事务,还应该对其做预处理,把已提交的事务同步到数据文件,未提交的事务要回滚.因此其备份的数据库,不能立即拿来恢复. MYSQL必读预处理的过程: MYSQL必读首先对完全备份文件只把已提交的事务同步至数据文件,要注意的是有增量的时候,不能对事务做数据回滚,不然你的增量备份就没有效果了. MYSQL必读然后把第一次的增量备份合并到完全备份文件内, MYSQL必读以此类推,把后几次的增量都合并到前一次合并之后的文件中,这样的话,我们只要拿着完全备份+二进制日志,就可以做时间点恢复. MYSQL必读4.14数据恢复 代码如下:[root@www ~]# service mysqld stop [root@www data]# rm -rf *? 模拟数据库崩溃 [root@www ~]# innobackupex --copy-back /innobackup/2013-09-12_11-03-04/ --copy-back数据库恢复,后面跟上备份目录的位置 MYSQL必读4.15检测: 代码如下:[root@www ~]# cd /mydata/data/ [root@www data]# chown mysql:mysql * [root@www data]#service mysqld start MYSQL必读检测结果数据正常. MYSQL必读本文出自 “遗失ぜ的ァ美好~” 博客 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |