PHP程序员玩转Linux系列 备份还原MySQL
作者:陶士涵 发布时间:2023-11-15 07:39:28
PHP程序员玩转Linux系列文章:
1.PHP程序员玩转Linux系列-怎么安装使用CentOS
2.PHP程序员玩转Linux系列-lnmp环境的搭建
3.PHP程序员玩转Linux系列-搭建FTP代码开发环境
前几天有个新闻,说是gitlab的工程师把数据文件给误删了,搞了个大事件,很多人都去围观了.备份工作应该在最开始的时候就要做,否则就会失去最佳时机,为了保证我的数据是安全的,因此我要搞备份了.备份分为逻辑备份和物理备份,逻辑备份是导sql,物理备份是基于文件的,这两种我都搞一下.
开启binlog
首先第一件事是打开binlog日志,编辑mysql配置文件开启一下,默认是关闭的.编辑 /etc/my.cnf ,log-bin=mysqlbinlog =号后面的是binlog日志的名字,默认生成在数据目录里面,重启一下mysql服务 , service mysqld restart
查看mysql的数据目录 , /var/lib/mysql ,mysqlbinlog.000001等文件就是binlog日志文件.
添加一些测试数据
建数据库,建表和插入一些记录,用于测试,表的存储引擎选择innodb,因为这个引擎容易测出来问题
#建库
create database entmail charset=utf8;
#建表,存储引擎选用innodb
create table user( id int auto_increment primary key, name varchar(100) not null default '' ) engine=innodb;
#插记录
insert into user values(null,'shihan');
insert into user values(null,'shihan1');
insert into user values(null,'shihan2');
insert into user values(null,'shihan3');
小数据量使用mysqldump逻辑备份
第一想到的备份方式是使用mysqldump,导出sql语句,恢复的时候就再次导入sql语句.
针对我的数据库,用户名root 密码空,我放sql文件的位置是/home/shihan1/mysql/sqls/ ,备份所有数据库,我的导出命令是下面这句
mysqldump -uroot --all-databases > /home/shihan1/mysql/sqls/all.sql
此时,我误删了数据库entmail , drop database entmail
不着急,马上进行恢复,执行以下导入命令,数据库立刻就回来了,注意一个是mysqldump命令,一个是mysql命令
mysql -uroot < /home/shihan1/mysql/sqls/all.sql
为啥不能用拷贝数据目录的方式备份
有的同学会使用直接拷贝数据目录的方式备份,我也测试了一下,实际证明这种方式是不正确的.我用tar命令把数据目录整个打包搬走,然后删除整个数据目录,再搬回来.
因为我把mysql的那几张用户表啥的都删了,mysql会进行重新初始化
我把数据文件再搬回来,然后进mysql看看,结果是这样的,告诉我user表不存在了,这张表是innodb引擎的,所以不能使用这种方式,幸亏我有前面的逻辑备份,从新导一下,数据又回来了.
mysql -uroot < /home/shihan1/mysql/sqls/all.sql
使用第三方软件percona-xtrabackup实现物理备份
可以实现物理备份的软件与很多,mysql也有企业版备份工具,但是貌似是收费的,percona-xtrabackup这个开源软件可以很好的实现全量备份和增量备份.
前往这个地址下载rpm包,里面可以选择版本,我最开始选的最新版2.4.6,结果报这个错误:Error: Built-in InnoDB in MySQL 5.1 is not supported in this release. You can either use Percona XtraBackup 2.0, or upgrade to InnoDB plugin.然后从新下了个2.0.0版是可以的.
https://www.percona.com/downloads/XtraBackup/
#下载rpm
wget https://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.0/RPM/rhel6/x86_64/percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm
#安装rpm
rpm -i percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm
#安装需要的依赖
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-MD5 rsync libev numactl
开始备份了
当前数据:
1. 我先把所有数据全量备份一次,后面那个目录是备份保存的目录,执行完成后出现innobackupex: completed OK!代表成功,生成的备份文件2017-02-24_17-47-55
innobackupex --user=root /home/shihan1/mysql/backups/
2. 添加几条新数据进去,现在的数据情况
insert into user values(null,'shihan4');
insert into user values(null,'shihan5');
3. 增量备份一次,就多了一个参数--incremental , 增量备份生成的文件是 2017-02-24_17-51-32 , 数据的大小也是不一样的
innobackupex --user=root --incremental /home/shihan1/mysql/backups/
4. 此时发生灾变,我把数据目录给删了!rm -rf /var/lib/mysql/* ,mysql已经连不上了
5. 抓紧恢复数据 , 准备全量备份文件 , 合并增量备份文件 , 执行恢复
#准备全量备份文件
innobackupex --apply-log --redo-only /home/shihan1/mysql/backups/2017-02-24_17-47-55/
#合并增量备份文件,注意看目录名
#如果有多次增量备份,就多次执行 innobackupex --apply-log --redo-only 增量目录 --incremental-dir 增量目录
innobackupex --apply-log --redo-only /home/shihan1/mysql/backups/2017-02-24_17-47-55/ --incremental-dir /home/shihan1/
mysql/backups/2017-02-24_17-51-32/
#执行恢复
innobackupex --copy-back /home/shihan1/mysql/backups/2017-02-24_17-47-55
6. 数据已经回来了,重新修改一下数据文件的属组和属主chown mysql:mysql -R /var/lib/mysql/* , 重启一下mysql ,数据全部恢复
下一篇定时执行备份脚本
来源:http://www.cnblogs.com/taoshihan/p/6437468.html


猜你喜欢
- 总结大家都知道,在开发中提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情。像微信这样的一个社交平台,如果做一
- 对着谷歌大神膜拜了一下午, 终于让我找到了一款免费的,国产货!!外观虽然不能跟老外的比,但是功能还挺全,实用就好。下载地址:http://x
- 1、golang中获取请求接口中数据(GET)方式一: API参数 ctx.Param(name string)或者ctx.Params.B
- 今天在pycharm(我用的python3)练习的时候,发现报了个AttributeError: module 'urllib
- 前几天翻出以前写的一个纯CSS仿微软经典菜单,现在看来才感叹,微软的经典菜单确实很经典,至少看起来不觉得厌烦。感叹归感叹,想想既然可以实现下
- 本文实例讲述了PHP Static延迟静态绑定用法。分享给大家供大家参考,具体如下:PHP5.3以后引入了延迟静态绑定static,它是为了
- 配置可能会随官方改变,本文仅供参考。1.下载安装GO的包到https://code.google.com/p/go/downloads/li
- 1. 得到安全字符串,在查询中使用,过滤单引号。Function Get_SafeStr(str) &nb
- 前言最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微
- MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进
- 简介除ide的执行方式外,命令行的方式执行Python脚本是参数化程序执行的一种常见且简单的方法,正确处理命令行参数,可以提供给包含某种参数
- MySQL 5.7.9版本sql_mode=only_full_group_by问题用到GROUP BY 语句查询时com.MySQL.jd
- 我就废话不多说了,直接上代码吧!import cv2img = cv2.imread("1.jpg")b, g, r =
- 本文实例为大家分享了Python将一个Excel拆分为多个Excel的具体代码,供大家参考,具体内容如下原始文档如下图所示将销售部门一、二、
- 因为Python是自带文档,可以通过help函数来查询每一个系统函数的用法解释说明。一般来说,关键的使用方法和注意点在这个系统的文档中都说的
- 瞎鼓捣系列~Numpy + matplotlib 画一个魔方前言NumPy是Python科学计算的基本包。它是一个Python库,提供了多维
- 1、RuntimeError: invalid argument 0: Sizes of tensors must match except
- 从 PDF 表格中获取数据是一项痛苦的工作。不久前,一位开发者提供了一个名为 Camelot 的工具,使用三行代码就能从 PDF 文件中提取
- 场景:查找who删了我,直接copy代码保存到一个python文件who.py,在python环境下运行此文件代码如下,copy保存到who
- set oSQLServer =server.createobject("SQLDMO.SQLServer")oSQLS