您的位置:首页 > 数据库 > MySQL

MySQL 数据备份与恢复(小学生篇)

2017-05-29 12:36 441 查看
(此篇文章是我13年学习时候的文章,比较古老了,所以称之为小学生篇)前言:MySQL 数据备份与恢复是很重要的,虽然对于 PHPer 的这方面的知识要求不高,但是也一定要会使用,不然到时候”仓老师”有事或者不在,那就很麻烦了。 MySQL 最基础的备份和恢复,到时候就可以在老板的面前”露一手”,相信不久你就会升职当上SEO,迎娶”白富美”,走上事业的巅峰(啊哈 ,纯属鬼扯),不过真的会有用的时候,OK 我们来简单的学习下:

基础环境:CentOS6.2 环境:Nginx(1.5.8)+PHP(5.3.28)+MySQL(5.5.35)

基本路径:
MySQL安装在:    /usr/local/
数据存放在:      /data/mysql/


一、MySQL 数据备份

1. MySQL 的备份我们可以使用工具(例如:phpmyadmin、SQLyog等...)或者 MySQL 内置插件(mysqldump) 等工具备份。

2. ok,我们先登录MySQL

2.1 mysql -uroot(请使用替换为自己MySQL的帐号) -p123456(请使用替换为自己MySQL的密码)

3. 我们新建一个数据库名称为:master

3.1 新建一个测试数据库 master
create database `master`;   #此处的 master 最好使用 `` 因为master 是 MySQL 的关键字,为了减少不必要的麻烦。

3.2 新建一个数据表 user ,和我一样菜的朋友们一定要学会手动建立建库、建表。
use master;
CREATE TABLE `user`(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(60) NOT NULL,
denger TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
age TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,
email VARCHAR(60) NOT NULL)ENGINE=MYISAM DEFAULT CHARSET=utf8;

3.3 基本的表我们已经建立好了,OK 我们试着插入一些数据
insert into `user`(name,denger,age,email) VALUES('张三',1,25,'onlineservice@gmail.com'),('李四',1,23,'firefox@qq.com');

3.4 以上最基本的新建数据库和数据表已经新建完成,我们先备份下数据库 master我们要备份的数据库 >导出 要导出的路径 | master.sql 要导出的文件名称

/usr/local/mysql/bin/mysqldump -uroot -p123456 master > /data/mysql/master.sql

执行以上的命令我们新建的数据库和数据表和数据表里面的数据已经备份完成了,很简单的操作没有技术含量的。

我们 cd /data/mysql/ ls 下会看到 master.sql


二、数据恢复

1. 我们来试试恢复,我们模拟下数据库丢失

1.1 登录MySQL
mysql -uroot(请使用替换为自己MySQL的帐号) -p123456(请使用替换为自己MySQL的密码)

1.2 删除数据表 user
drop table user;

1.3 恢复数据表 user

1.3.1 退出MySQL
exit或quit;

1.3.2 恢复数据
/usr/local/mysql/bin/mysql -uroot -p123456 master < /data/mysql/master.sql

注意这里是 < 表示导入, > 这表示导出

2. 经过以上的基本的 2 个命令操作我们能实现最基本的数据备份和恢复,在此我特地的说明下 我们的恢复其实在某些情况是不一定是完整的,如果我们的服务器或者MySQL 瘫痪了怎么办,最直接的假如我们想恢复一段时间的数据怎么办?

这时我们必须借助 MySQL 的log-bin 日志来帮助我们完全恢复数据

2.1 ok 那也很简单,首先我们需要开启log-bin日志,也可以先登录到 mysql 查看自己是否开启了 log-bin, 命令:

show variables like "%log_bin%" 如果看到的value值是ON ,ok表示你已经开启了 log-bin 日志 ,反之OFF,则没有开启。

2.2 如果未开启 log-bin 日志则尝试编辑 my.cnf 文件 ,vim /etc/my.cnf
找到 log-bin 去掉前面的 "#",替换为 log-bin=mysql-bin

2.3 如果已经开启了 log-bin 日志,那么我们找下这个日志在哪儿,如果你是编译安装的环境可能会在 /usr/local/mysql/var/ 或则 /var/lib/mysql/ 目录下 ,这个是根据自己在编译 MySQL 的时候自己配置的,我放在数据库的位置是在 /data/mysql/ 下,如果不清楚自己的数据存放的位置直接 vim /etc/my.cnf 找到 datadir = **/** 就ok,找到后我们会看到一些文件 mysql-bin.000001 这个文件就是我们想要的 bin-log日志,比如还有一些 慢查询日志 这些也是很重要的,在网站调试 、SQL 优化的时候我们可能会开启慢查询日志,便于我们去分析一些 SQL 不是很优化的地方

3. 为了大家更加明白,我们借用 user 表,我们来做一个小小的测试。

3.1 测试内容:
假设:9:00 我们对数据进行了一次备份,然而在9:00之后数据库崩溃,我们如何恢复?
思路:9:00 之前的数据我们通过备份的数据进行恢复,9:00之后的我们通过 log-bin 日志恢复
模拟操作:

3.1.1 先备份 9:00 前的数据

3.1.1.1 登录 MySQL

mysql -uroot(请使用替换为自己MySQL的帐号) -p123456(请使用替换为自己MySQL的密码)

3.1.1.2 备份数据库 master

/usr/local/mysql/mysqldump -uroot -p123456 master -l -F > /data/mysql/master.sql

参数详解: -l 是对数据库进行读锁,为了避免在备份的时候出现数据被用户 对数据就行 update、delete、insert 等操作
-F 是 flush logs 重新生成新的日志

3.1.2 模拟用户在 9:00 之后的操作

3.1.2.1 添加数据到 user 表,或者是修改 user 表里面的数据
注意现在数据里面我们有2条数据,我们现在在添加2条数据,ID 是自增的。我们更新最后一条数据

操作1:    insert into `user`(name,denger,age,email) VALUES('王麻子',1,18,'wangmazi@gmail.com'),('新月',0,20,'newmoon@qq.com');
操作2: update user set name='王思月' where id=4;

3.1.2.2 模拟数据库崩溃
我们手动清空 数据表里面的数据
登录到 MySQL mysql -uroot(请使用替换为自己MySQL的帐号) -p123456(请使用替换为自己MySQL的密码)

生成新的日志:flush logs, 为了分离 truncate 操作,不然恢复 mysql-bin.000002 时候里面有 truncate 操作则又会出现恢复后 又被 truncate

清空数据:truncate user 或者直接删除 user 这个表;

3.1.3 恢复操作

3.1.3.1 根据思路我们试着恢复下数据
先恢复下备份数据 就2条
/usr/local/mysql/bin/mysql -uroot -p123456 < /data/mysql/master.sql
然后 在利用 bin-log 日志恢复,注意:我们这里是 恢复 mysql-bin.000002 因为mysql-bin.000003 是 truncate 操作,故我们不会恢复
/usr/local/mysql/bin/mysqlbinlog --no-defaults /data/mysql/mysql-bin.000002 | mysql-uroot -p123456 master;

其实有的时候我们不会人为的去 flush logs ,so 有时候我们会根据 position(位置点) 和 date (时间点)来恢复,通常会安装位置点来做恢复 ,因为时间点可能有时候不太精确,特别是服务器的时间出现异常的,所以我们需要手动的打开 bin-log 日志去看看 那些东西是我们需要的,MySQL 内置了 日志查看的插件。

3.1.3.2 如何查看 bin-log 日志
MySQL 提供了 mysqlbinlog
/usr/local/mysql/bin/mysqlbinlog --no-defaults /data/mysql/mysql-bin.000002 |more

对于新手来说可能会看到的东西感觉乱七八糟的,ok 我们仔细看了一些东西的时候 发现时曾相识的感觉

例如:insert into `user`(name,denger,age,email) VALUES('王麻子',1,18,'wangmazi@gmail.com'),('新月',0,20,'newmoon@qq.com');/update user set name='王思月' where id=4;

更重要的是我们要看 position 的位置,end_log_pos 107 到 end_log_pos 708 之间的操作都是我们的插入操作 或者修改操作,很好我们可以利用 position 进行恢复
/usr/local/mysql/bin/mysqlbinlog --no-defaults  --start-position="107" --stop-position="708" /data/mysql/mysql-bin.000002 | mysql-uroot -p123456 master
直接进行恢复,恢复更加灵活。按照时间也是同理,此处不讲解了
--start-date="2013-01-28 09:00:00" --stop-date="2013-01-28 12:00:00"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息