MySQL安装脚本
一般逻辑备份的文件名后缀以.sql
居多
逻辑备份就是把数据库、数据表或者数据进行导出,导出到一个文本文件中
mysqldump
是MySQL自带的命令本质: 导出的是sql语句文件
优点: 无论是什么存储引擎,都可以用mysqldump备成sql语句
缺点: 速度较慢,导入时可能会出现格式不兼容的突发状况.无法直接做增量备份.
提供三种级别的备份,表级,库级和全库级
mysqldump
基本语法:
命令格式:
表级别备份:
# mysqldump [OPTIONS] database [tables]
库级别备份:
# mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
全库级别备份:
#mysqldump [OPTIONS] --all-databases [OPTIONS]
创建测试数据:
创建表格:
mysql > create database db_sanguo default charset=utf8;
mysql > use db_sanguo;
mysql > create table tb_weiguo(
id int not null auto_increment,
name varchar(20),
age tinyint unsigned default 0,
profession varchar(20),
primary key(id)
) engine=innodb default charset=utf8;
插入测试数据:
mysql > insert into tb_weiguo values (null,'曹操','36','主帅'),(null,'郭嘉','22','军师'),(null,'张辽','30','战将'),(null,'甄宓','18','文昭皇后');
创建表格:
mysql > create table tb_shuguo(
id int not null auto_increment,
name varchar(20),
age tinyint unsigned default 0,
profession varchar(20),
primary key(id)
) engine=innodb default charset=utf8;
插入测试数据:
mysql > insert into tb_shuguo values (null,'刘备','36','主帅'),(null,'诸葛亮','22','军师'),(null,'赵子龙','30','战将'),(null,'孙尚香','18','弓腰姬');
表级备份与还原基本语法:
命令格式:
备份数据表:
#l /mysql_3307/bin/mysqldump 数据库 数据表1 [数据表2] > .sql备份文件位置 -p => 指定哪个数据库下的哪些表要备份
Enter password:
还原数据表:
第一种:
# mysql > use 数据库; => 指定哪个数据库,还原的数据表就存放在哪个数据库下
# mysql > source .sql备份文件位置;
或
第二种:
#l /mysql_3307/bin/mysql 数据库 < .sql备份文件位置 -p
Enter password:
演示:
备份数据表:
# mkdir /tmp/sqlbak => 创建一个目录用于放备份文件
#l /mysql_3307/bin/mysqldump db_sanguo tb_weiguo [tb_shuguo] > /tmp/sqlbak/tb_weiguo.sql -p => 将数据表备份成tb_weiguo.sql文件
Enter password:
说明:如果需要备份多张表,只需要在其后面加上表名即可
还原数据表:
第一种:
# mysql > use db_bbb; => 数据表会还原在db_sanguo数据库下
# mysql > source /tmp/sqlbak/tb_weiguo.sql;
第二种:
#l /mysql_3307/bin/mysql db_sanguo < /tmp/sqlbak/tb_weiguo.sql -p => 数据表会还原在db_sanguo数据库下
--databases
选项,指定需要备份的数据库库级备份与还原基本语法:
命令格式:
备份数据库:
# /mysql_3307/bin/mysqldump --databases 数据库1 [数据库2] > .sql备份文件位置 -p => 指定需要备份的数据库进行备份
还原数据库:
第一种:
# mysql > source .sql备份文件位置; => 直接使用命令还原
或
第二种:
#l /mysql_3307/bin/mysql < .sql备份文件位置 -p
Enter password:
开启日志文件:
# vim /mysql_3307/my.cnf
[mysqld]
...
server-id=10
log-bin=/mysql_3306/data/binlog
# service mysql_3307 restart
mysqldump高级选项说明:
常用选项 | 描述说明 |
---|---|
--flush-logs , -F |
开始备份前刷新日志(二进制日志)binlog.000001 => binlog.000002 |
--flush-privileges |
备份包含mysql数据库时刷新授权表 => 刷新用户和授权信息 |
--lock-all-tables , -x |
MyISAM一致性,服务可用性(针对所有库所有表) ,针对 MyISAM引擎 |
--lock-tables , -l |
备份前锁表(针对要备份的库) |
--single-transaction |
适用InnoDB引擎,保证一致性,服务可用性 |
--master-data=2 |
表示将二进制日志位置和文件名写入到备份文件并在dump文件中注释掉这一行 |
--master-data=1 |
表示将二进制日志位置和文件名写入到备份文件,在dump文件中不注释这一行 |
--master-data
参数其他说明:
1)恢复时会执行,默认是1
2)需要RELOAD privilege并必须打开二进制文件
3)这个选项会自动打开–lock-all-tables,关闭–lock-tables
全库级备份和还原:
命令格式:
备份全库:
# /mysql_3307/bin/mysqldump --all-databases --master-data --single-transaction > .sql文件 -p => 将数据库中所有数据库备份
还原全库:
第一种:
# mysql > source .sql备份文件位置; => 直接使用命令还原
或
第二种:
#l /mysql_3307/bin/mysql < .sql备份文件位置 -p
Enter password:
总结:
mysqldump工具备份的是SQL语句,故备份不需要停服务
使用备份文件恢复时,要保证数据库处于运行状态
只能实现全库,指定库,表级别的某一时刻的备份,本身不能增量备份
适用于中小型数据库
增量备份原理:
增量备份实验步骤 :
①先准备数据(前提),
②开启二进制,然后做全量备份(全库备份)
③继续对数据库进行增删改操作
④突然发生了硬件故障,数据库丢失了
⑤恢复全量备份导出的数据(不完整,因为在备份时数据库可能会产生增删改操作,可能只有90%)
⑥备份二进制日志,根据其信息(导入剩余的10%的数据)
增量备份实验步骤:
第一步:准备测试数据,直接拿上面的魏国数据表来测试
第二步:开启二进制文件,重启服务,然后进行全库备份
--flush-logs
刷新了日志,这样在恢复全备数据后,只需要找到最新的二进制文件查看并恢复即可开启二进制文件:
# vim /mysql_3307/my.cnf
...
server-id=1
log-bin=/mysql_3307/data/binlog
# service mysql_3307 restart
mysqldump 全库备份:
# mkdir /tmp/mysqlbak => 创建全备的保存路径
# /mysql_3307/bin/mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > /tmp/mysqlbak/all_1.sql -p
选项说明:
--flush-logs:表示刷新日志文件,那么增量备份直接备份新的日志文件即可
第三步:对数据库进行增删改操作
# mysql > use db_sanguo
# mysql > insert into tb_weiguo values (null,'孙权','11','谋略家');
# mysql > delete from tb_weiguo where name='张辽';
# mysql > update tb_weiguo set profession='人妻曹' where name='曹操';
第四步:模拟发生硬件故障,数据库丢失(手动删库)
# mysql_3307 -e "drop database db_sanguo;" -p
Enter password:
第五步:进行数据恢复到全备时候状态
需要把最新的二进制日志文件进行备份:
# cp /mysql_3307/data/binlog.00000x /tmp/mysqlbak/
先进行全库恢复:
# mysql_3307 < /tmp/mysqlbak/all_1.sql -p
第六步:通过binlog增量备份还原数据库到100%
mysqlbinlog命令
查看和恢复二进制日志文件mysqlbinlog
命令查看先查看一下二进制日志文件
#l /mysql_3307/bin/mysqlbinlog /tmp/mysqlbak/binlog.00000x
备注:binlog.00000x 代表产生的最新二进制日志文件
找到事故临界点后开始还原数据:
#l /mysql_3307/bin/mysqlbinlog --start-position=4 --stop-position=1057 /tmp/mysqlbak/binlog.00000x |mysql_3307 -p
到此增量备份实现完成
无论是什么存储引擎,以下方式本身是一种数据导出的方法,同时可以用来辅助备份,它可以对一个表的其中一列或者某几列做备份。备份的是数据记录。
secure_file_priv | 在配置文件开启数据导入导出功能,并指定其路径 |
---|---|
into outfile | 执行导出的命令 |
重点:
基本语法:
命令格式:
修改MySQL配置文件,开启数据导入导入导出功能:
# vim /mysql_3307/my.cnf => 增加一行配置
...
secure_file_priv=逻辑导入导出的路径
导出语法:
# mysql > select * into outfile '逻辑导出的路径' from 数据库.数据表;
演示:
指定逻辑导出的路径:
# vim /mysql_3307/my.cnf
...
secure_file_priv=/tmp/mysqlbak/
# service mysql_3307 restart
增加mysql用户对路径的写入权限:
# setfacl -m u:mysql:rwx /tmp/mysqlbak
导出数据表:
# mysql > select * into outfile '/tmp/mysqlbak/tb_shuguo.txt' from db_sanguo.tb_shuguo;
典型应用场景: 可以把一些规则的文本文件导入到数据表中
基本语法:
命令格式:
第一种:
# mysql > load data local infile '导入数据文件路径' into table 数据表;
第二种:
#l /mysql_3307/bin/mysqlimport 数据库名称 [选项] 导入路径 -p
注意:导入的文件必须和数据表名称保持一致,否则无法识别导入哪个表
选项说明:
--fields-terminated-by=':',指定导出文件的分隔符为冒号:
--lines-terminated-by='\n',指定每一行的结尾使用的符号,\n代表换行符
演示:比如将/etc/passwd 的内容导入数据表
第一步: 创建一个数据表(字段必须和文件列相等)
创建数据表:
# mysql > create database db_test; => 创建一个数据库
# mysql > use db_test;
# mysql > create table `password`(
`uname` varchar(50) default null,
`passwd` varchar(2) default null,
`uid` varchar(11) default null,
`gid` varchar(11) default null,
`comment` varchar(255) default null,
`home` varchar(50) default null,
`shell` varchar(50) default null
) engine=innodb default charset=utf8mb4;
说明:password是mysql保留关键字(有特殊作用),建议使用``两个反撇号括起来
字段有可能也是保留关键字,建议也引起来,不影响表的创建
第二步:把需要导入的文件拷贝到逻辑导入导出路径,然后进行导入
第一步:拷贝文件
# cp /etc/passwd /tmp/mysqlbak/password.txt
第二步:使用mysqlimport命令将文件导入数据表
#l /mysql_3307/bin/mysqlimport db_test --fields-terminated-by=':' --lines-terminated-by='\n' /tmp/mysqlbak/password.txt -p
选项说明:
--fields-terminated-by=':',指定导出文件的分隔符为冒号:
--lines-terminated-by='\n',指定每一行的结尾使用的符号,\n代表换行符
db_test :指定数据库,因为文件名叫password.txt,这个库下面有一个相同的数据表,会自动匹配导入数据
或第二步:进入mysql执行语句进行导入
先将冒号转换为空格符:
# sed '1,22y/:/ /' /etc/passwd > /tmp/mysqlbak/password.sql
或
# awk 'BEGIN{FS=":"}{print $1,$2,$3,$4,$5,$6,$7}' /etc/passwd > /tmp/mysqlbak/password.sql
然后进入mysql导入数据文件:
# mysql > use db_tast;
# mysql > load data local infile '/tmp/mysqlbak/password.sql' into table password;
MySQL其实还支持很多管理软件(Windows版):MySQL-Front、Navicat
使用Navicat 工具必须得有远程连接的账号
数据逻辑导出:
数据逻辑导入:
数据表备份:
数据表的还原:
数据库备份:
数据库还原: