mysql学习笔记三 —— 数据恢复与备份
要点:
1、存储引擎
2、导入导出
3、备份与恢复
查看当前数据库中的所有表
use db1;
show tables;
1、存储引擎
不同的发动机(引擎)适用的汽车类型不一样。
存储和处理的不同方式。不同的存储引擎适用的应用场景也不同。
MySQL 插件式存储引擎是MySQL独有的设计,主要引擎有以下两种:
myisam
InnoDB
1.1 myisam存储引擎
MySQL5.5版本之前的默认存储引擎。创建表对象时,如果没有显式指定表的存储引擎,那么这个表就是myisam表。
创建一个myisam表:
mysql> create table t1(id int not null auto_increment primary key unique , name char(5),xingbie enum('M','F'));(默认)
一个myisam表在文件系统上对应三个文件:
*.frm 表结构文件
*.MYD 存放数据
*.MYI 存放索引
myisam表有特点:
支持锁机制 表锁 缺点:并发读没什么影响,但是如果有insert 、update操作那么会影响读操作,适用于读多写少的表 查询速度快 读取速度快,写入速度也快。写入速度块,因为写入到缓存,按照操作系统的机制达到一定条件后刷新到磁盘,不能够保证数据高可靠。
最大存储能力 256T ext4 xfs
1.2 innodb
5.5版本之后的默认存储引擎
mysql> create table t2(id int not null auto_increment primary key unique , name char(5),xingbie enum('M','F')) engine=innodb; //指定存储引擎
mysql> show create table t2;
修改MySQL默认的存储引擎:
方法一:修改配置文件
default-storage-engine=innodb(之后新建库的表默认是innodb)
方法二:修改全局和会话参数
mysql> set global storage_engine=myisam;
mysql> set session storage_engine=myisam;
innodb表的文件:
*.frm 表结构文件
ibdata1 innodb表系统表空间文件,所有InnoDB表的数据、undo(回滚)、索引等 ,数据目录下(/var/lib/mysql)
当删除数据后,InnoDB的系统表空间不会降低,即使用truncate删除也是如此。
InnoDB表的特性:
InnoDB支持事物:
事物的特性ACID:
原子性:不能再往下分割,事物是最小的一个单位。事物提交后,要么成功提交,要回回滚会原来的状态。
一致性:指数据完整性的约束。事物从一种一致性的状态转换成另外一种一致性的状态。name字段 unique
隔离性:两个不同的事物不能看到对方的操作。
持久性:提交过的数据就会保存起来,不会丢失,InnoDB独有日志,redo log(重做日志);硬件:raid 、磁盘。数据高可靠,高可用。
日志文件组:默认两个文件(ib_logfile0 ib_logfile1),每个5M,循环使用 建议不要太大,否则故障恢复时间过长。
例,开启一个事物:
默认情况下,MySQL隐式提交,所有修改操作自动提交。
mysql> set autocommit=off; 关闭自动提交功能,当commit才会提交修改操作
mysql> start transaction; 开启一个事物,或者用begin;来开启一个事物
mysql> roolback; 回滚到之前的状态
mysql> commit; 提交事物
锁机制:row level行级锁 写并发大,读并发大。适用于读写都多的情况。缺点:相对慢
两者区别对比:
1、MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。
2、InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。
2.导入导出
2.1 mysqlimport命令行工具导入数据 生产常用工具导入,如mysql常用Navicat连接数据库操作,导入数据时直接使用其自带工具导入功能。
使用Navicat导入实例:
步骤一:做好excel表数据内容,其他文档也行如txt.
excel表数据(表列名为数据库xxx表的列名)
步骤二:打开Navicat,连接数据库,选择需要导入数据的表名,右键选择“导入向导”,并选择导入文件类型。
步骤三:依次按要求下一步
自动识别分隔符,默认即可。
自动对比导入表格与数据库表格列名,也可以手动选择
选择导入模式,此处选择添加
直接下一步,点击开始即可完成数据导入。
使用mysqlimport导入
mysqlimport -uroot -p123456 -S /var/lib/mysql/mysql.sock DB1 --fields-terminated-by=',' --default-character-set=utf8 /tmp/loaddata.txt(此文件要和库中表结构相同才能载入)
--fields-terminated-by=',' 指定列的分隔符,默认“tab”
--default-character-set=utf8 链接字符集 需要注意要修改服务器的所有字符集为utf8
配置文件:(重要提示 :建议开启mysql前就设置,否则新建库中表文件的格式很难改过来)
[mysqld]
character_set_server=utf8 //服务字符集,全局
[mysqld_safe]
character_set_database=utf8
[mysql]
default-character-set=utf8 //连接字符集
重启mysql
如果出现乱码,修改表、列字符集:
mysql> alter table DB1.loaddata CHARACTER SET utf8;
mysql> alter table loaddata modify city char(5) CHARACTER SET utf8;
修改了源文件:
[root@localhost tmp]# cat /tmp/loaddata.txt
100001#胡一#北京#huyi@163.com
100002#胡二#上海#huer@163.com
100003#胡三#广州#husan@163.com
100004#胡四#深圳#husi@163.com
100005#胡五#杭州#huwu@163.com
mysql> create table t7 like loaddata; //创建t7表,表结构同loaddata表
导入:
[root@localhost tmp]# mysqlimport -uroot -p -S /var/lib/mysql/mysql.sock --default-character-set=utf8 --fields-terminated-by="#" DB1 /tmp/t7.txt
Enter password:
修改原文件:
[root@localhost tmp]# mv /tmp/t7.txt /tmp/t8.txt
[root@localhost tmp]# cat /tmp/t8.txt
"100001"#"胡#一"#"北#京"#"huyi@163.com"
创建对应的表:(名称相同)
mysql> create table t8 like loaddata;
导入:
[root@localhost tmp]# mysqlimport -uroot -p -S /var/lib/mysql/mysql.sock --default-character-set=utf8 --fields-terminated-by="#" --fields-enclosed-by=\" DB1 /tmp/t8.txt
mysqlimport -uroot -p123 -S /var/lib/mysql/mysql.sock db1 --default-character-set=utf8 --fields-terminated-by=',' /tmp/t3.txt
--fields-enclosed-by=\" 指定列值的包括符 ,即在"" 之内的才是一个具体的列值
--lines-terminated-by 指定行分隔符(换行符),\n
2.2 SQL语句导入数据 load data infile
mysql> load data infile '/tmp/loaddata.txt' into table DB1.t10 character set utf8 fields terminated by ',' ;
character set utf8 指定链接字符集
fields terminated by ',' 指定字段分隔符
[root@localhost tmp]# cat loaddata.txt
100001#"胡#一"#"北#京"#"huyi@163.com"
mysql> load data infile "/tmp/loaddata.txt" into table DB1.t11 character set utf8 fields terminated by "#" enclosed by "\"" ;
enclosed by "\"" 等于mysqlimport中的--fields-enclosed-by 指定的是列值包括符号(字段包括符号)
2.3 SQL导出数据
select
mysql> select * from t10 into outfile "/tmp/xxdddd.txt" character set utf8 fields terminated by ',';
3、备份与恢复
分情况 myisam InnoDB
冷备、热备
增量备份与恢复
按时间点、binlog位置恢复
mysql ab复制
3.1 冷备份
实现方式:先关闭服务 拷贝相关文件
备份时要考虑你的mysql中表都是什么表,如果全是myisam表,可以实现全备、备份部分库、备份部分表;但是如果全是InnoDB表,只能全库备份。
InnoDB表的全库备份--冷备份:
3.1.1 关库
service mysqld stop
3.1.2 cp到备份集存放路径
mkdir /opt/all.bak/
cp -pr /var/lib/mysql/* /opt/all.bak/
myisam表备份:
全备份
部分库
部分表
全库备份恢复:关库
恢复部分库、部分表:不需要关库
冷备份:
需要关库-->影响线上业务
热备份:
不需要关库备份,一定程度上不影响线上业务。
mysqldump命令行工具
逻辑备份的一种,备份的是SQL语句(insert、update)
myisam表可以实现全库备份、部分库备份、部分表备份;
InnoDB表只能实现全库备份
热备时加锁,能够实现备份集与数据库中的数据一致。
myisam和InnoDB加锁的选项不同
myisam表 -x
innodb表 --single-transaction 事物表
用mysqldump实现myisam表的全库备份、部分库备份、部分表备份:
[root@localhost db1]# mysqldump -uroot -p -x --all-databases > /opt/all.sql
注意:由于mysql在全量导出时不导出event事件表,故需要在全量导出时忽略事件表,可能会报mysql.event的错误,解决如下:
mysqldump -uroot -p -x -A --events ignore-tables=mysql.events --all-databases > /opt/all.sql (经过测试--all-databases没有-A好用,实例如下)
[root@localhost db1]# mysqldump -u root -p -x --databases db1 > /opt/db1.sql
Enter password:
[root@localhost db1]# mysqldump -uroot -p -x db2 t1 > /opt/db2_t1.sql
选项:
-x;--lock-all-tables:锁定所有库中的所有表(MyISAM表)
-A;--all-databases:备份所有库中所有的表(MyISAM表和InNODB表)
--single-transaction:加事务锁(适合应用于InNODB引擎表和MyISAM表)
MyISAM:
全库备份:
[root@localhost ~]# mysqldump -usystem -p -x -A > /opt/all.sql
备份部分库:
[root@localhost ~]# mysqldump -usystem -p -x --databases db1 > /opt/db1.sql
备份部分表:
[root@localhost ~]# mysqldump -usystem -p -x db1 t1 > /opt/t1.sql
恢复:
[root@localhost mysql]# mysql < /opt/all.sql
[root@localhost DB1]# mysql -uroot -p123456 -S /var/lib/mysql/mysql.sock < /opt/db1.sql
[root@localhost DB1]# mysql -uroot -p123456 -S /var/lib/mysql/mysql.sock db2 < /opt/db2_t1.sql
Innodb:(只能全库备份)
[root@localhost ~]# mysqldump -usystem -p --single-transaction -A > /opt/all.sql //全数据库备份
[root@localhost ~]# mysqldump -usystem -p --single-transaction --databases test > /opt/all.sql //test全库备份
恢复:
[root@localhost mysql]# mysql < /opt/all.sql
[root@localhost DB1]# mysql -uroot -p123456 -S /var/lib/mysql/mysql.sock < /opt/all.sql
生产实例:
备份mysql:
mysqldump -u$User -p$Passwd -R --opt --flush-logs --databases test | gzip > $Backup_mysql_path/$Backup_date.mysql_backup.gz //实验加上--opt执行一次会产生2个binlog日志
备份生产test数据库全库并通过gzip压缩,按日期命令压缩包名(--opt可实现加锁,等同于调用add-locks、lock-tables等参数)
还原mysql:
mysql -uroot -p123456 -S /var/lib/mysql/mysql.sock < mysql_backup //Linux系统中后缀名不重要,该mysql_backup是通过mysqldump备份test这个数据库的全库备份sql文件。也可命令为mysq_backup.sql
推荐备份参数添加
-R --single-transaction --quick --flush-logs --databases test
解释:
--opt:此mysqldump命令参数是可选的,如果带上这个选项代表激活了mysqldump命令的 quick,add-drop-table,add-locks,extended-insert,lock-tables参数,也就是通--opt参数在使用Mysqldump导出Mysql数据库信息时不需要再附加上述这些参数。
–quick:代表忽略缓冲输出,mysqldump命令直接将数据导出到指定的SQL文件。
–add-drop-table:顾名思义,就是在每个CREATE TABEL命令之前增加DROP-TABLE IF EXISTS语句,防止数据表重名。
–add-locks:表示在INSERT数据之前和之后锁定和解锁具体的数据表,你可以打开mysqldump导出的SQL文件,在INSERT之前会出现LOCK TABLES和UNLOCK TABLES语句,防止在这些记录被再次导入数据库时其他用户对表进行的操作。
–extended-insert (-e):此参数表示可以多行插入。
增量备份
结合全库备份,每周一全库备份,周二至周日增量备份 1 2 3
配置文件中开启binlog
log_bin=binlog //名称
log_bin_index=binlog.index //设置binlog索引
重启mysql
[root@localhost mysql]# ls
binlog.000001 db1 db3 ib_logfile0 mysql
binlog.index db2 ibdata1 ib_logfile1 mysql.sock
为了便于管理,可以将binlog日志独立出来,如:一天产生一个binlog文件,binlog.000001、binlog.000002....
怎样实现增量备份:
通过mysql的binlog日志来实现增量备份。
binlog:记录的是SQL语句,记录insert、update、drop、delete的SQL语句;二进制日志,mysqlbinlog可以查看binlog日志内容
刷新binlog的方式:
service mysqld restart
之后将产生binlog.000002,这时就可以将binlog.000001当作昨天的备份了(但是此方法需要重启mysql,一般不用,用下面的方式刷新)
flush logs; mysql运行时执行SQL语句
mysql -uroot -p123 -e "flush logs;"
增量备份实现:
周二至周日每天0点0分 执行flush logs 然后将之前的那个binlog拷贝到备份集目录 --crontab计划任务
1 2 3 10点 根据时间点恢复、根据binlog位置(postion)
查看刷新出来的binlog日志信息 mysqlbinlog binlog.0000003
(以下恢复需要关闭mysql服务)
先恢复全库备份
恢复前,先关闭binlog(修改配置文件),否则所有的操作又记录到binlog中
[root@localhost mysql]# mysql < /tmp/all.sql
恢复增量备份000003
[root@localhost mysql]# mysqlbinlog /opt/binlog/binlog.000003 |mysql -uroot -p123456
先查看binlog中的信息:mysqlbinlog /var/lib/mysql/binlog.000004
再去恢复增量备份000004 按照时间点、位置来恢复
#170816 16:27:04
#170816 16:27:42
# at 286
end_log_pos 379
[root@localhost mysql]# mysqlbinlog --start-datetime='2017-08-16 16:27:04' --stop-datetime='2017-08-16 16:27:42' /opt/binlog/binlog.000004 |mysql -uroot -p123456
[root@localhost mysql]# mysqlbinlog --start-position=286 --stop-position=379 /opt/binlog/binlog.000004 |mysql -uroot -p123456
mysql学习笔记三 —— 数据恢复与备份的更多相关文章
- MYSQL学习笔记三:日期和时间函数
MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...
- MySql学习笔记三
MySql学习笔记三 4.DML(数据操作语言) 插入:insert 修改:update 删除:delete 4.1.插入语句 语法: insert into 表名 (列名1,列名2,...) val ...
- MySQL学习笔记三:库和表的管理
1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...
- mysql基本数据类型(mysql学习笔记三)
Mysql数据类型 小数: 浮点:小数位可以变化 Float单精度默认精度6位左右 Double 双精度默认精度16位左右 支持,控制数值范围 Type(M,D) M表示所有数值位数(不包括小数点和符 ...
- MySQL学习笔记(三)—索引
一.概述 1.基本概念 在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经 ...
- MySQL学习笔记(三):常用函数
一:字符串函数 需要注意的几个细节: 1.cancat中有一个字符串为null,则结果为null. 2.left(str,x) 和 right(str,x)中x为null,则不返回任何字符串,不是nu ...
- mysql学习笔记(三)
-- 主键冲突(duplicate key) ,'xujian','anhui'); ,'xiewei','anhui'); ,'luyang','anhui');-- 主键冲突了 -- 可以选择性的 ...
- MySql学习笔记(三) —— 聚集函数的使用
1.AVG() 求平均数 select avg(prod_price) as avg_price from products; --返回商品价格的平均值 ; --返回生产商id为1003的商品价格平均 ...
- Mysql学习笔记(三)对表数据的增删改查。
正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...
随机推荐
- 各个版本的 Oracle 11.2.0.4下载地址
Oracle 11.2.0.4下载地址 Linux x86: https://updates.oracle.com/Orion/Services/download/p13390677_112040_L ...
- 安装Docker和配置加速器(二)
一. 安装 docker-ce 1. 访问 https://opsx.alibaba.com/mirror 2. 打开这条URL: 二.Ubuntu 系统安装 Docker 1. 使用apt-get进 ...
- Echo团队Alpha冲刺随笔 - 第三天
项目冲刺情况 进展 完成了三分一左右,前端整体页面框架已有,后端也在稳步推进 问题 今天问题较少,主要还是出在对于框架的掌握上 心得 继续加油! 今日会议内容 黄少勇 今日进展 实现社区公告,个人信息 ...
- python:利用smtplib模块发送邮件
自动化测试中,测试报告一般都需要发送给相关的人员,比较有效的一个方法是每次执行完测试用例后,将测试报告(HTML.截图.附件)通过邮件方式发送. 参考代码:send_mail.py 一.python对 ...
- STL语法——集合:set 安迪的第一个字典(Andy's First Dictionary,UVa 10815)
Description Andy, , has a dream - he wants to produce his very own dictionary. This is not an easy t ...
- linux内存源码分析 - SLAB分配器概述
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...
- oracle 相除后保留指定位数小数round()
) xxx from dual; XXX---------- 3.8871
- linux ssh修改 默认22端口
修改ssh 配置 /etc/ssh/sshd_config service sshd restart
- 算法相关——Java排序算法之快速排序(三)
0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...
- [Spark][python]RDD的collect 作用是什么?
[Spark][Python]sortByKey 例子的继续 RDD的collect() 作用是什么? “[Spark][Python]sortByKey 例子”的继续 In [20]: mydata ...