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 ...
随机推荐
- mybatis 枚举的支持
文章转自 https://www.cnblogs.com/jeffen/p/6380724.html 在spring-boot中可以通过yml全局配置枚举执行器
- WEB安全 - 认识与防御XSS攻击
目录 什么是xss攻击? XSS的危害 XSS攻击分类 xss攻击示例 反射型攻击 - 前端URL参数解析 反射型攻击 - 后端URL参数解析 注入型攻击 - 留言评论 如何规避xss攻击? 总结 什 ...
- 【Codeforces 1132F】Clear the String
Codeforces 1132 F 题意:给一个串\(S\),问每次删除连续的一段相同字母,最少删几次将原串删空. 思路:考虑区间\(dp\),我们看要删多少次能把\([l,r]\)删空,那么最终答案 ...
- Centos7下完美安装并配置mysql5.6
Centos7将默认数据库mysql替换成了Mariadb,对于我们这些还想用mysql的人来说并不是一个好消息. 最近我搜罗了网上各种安装教程,各种出问题,要么安装失败,要么安装成功了却使用不了my ...
- 15-(基础入门篇)GPRS(Air202)GPIO控制点亮一个灯
https://www.cnblogs.com/yangfengwu/p/9967027.html 现在点亮它,说一下哈,都过去好久了,不知道大家都在用哪个版本的库 http://www.openlu ...
- [01] Why Spring
1.何为框架 简单来说,框架就是制定了一套规范或者规则(思想),让程序员在该规范或规则下进行工作.如上图修楼房,在有框架的情况下,修建工作才高效且有条不紊.楼层钢架规定了大楼的结构,工人按架构添砖放瓦 ...
- odoo之页面跳转
击备注时,会由备注id带出他的内容 customer.requirement这是备注内容表 def sale_requirements_change(self, cr, uid, ids, requi ...
- SQL Server 中如何移动tempdb到新的位置
操作步骤:1.检查tempdb的逻辑名字和它的存在位置.可以使用下面语句: SELECT name, physical_name FROM sys.master_files WHERE databas ...
- (转)/etc/init.d/functions详解
转自:https://www.cnblogs.com/image-eye/archive/2011/10/26/2220405.html functions这个脚本是给/etc/init.d里边的文件 ...
- Bootstrap Modal 使用remote从远程加载内容
Bootstrap的Modal这个模态窗组件还是很好用的,但在开发的过程中模态窗中的内容大部分都是从后端加载的.要实现模态窗的内容是从后端加载话,常用的实现方式有2种.它们是: (1) ...