时间:2021-07-01 10:21:17 帮助过:9人阅读
目录
1. 备份数据的意义
2. 数据库备份... 1
2.1 备份单个数据库练习多种参数使用... 1
2.1 mysqldump的工作原理... 8
.3. 数据库备份实践... 9
3.1 备份多个库... 9
3.2 分库备份... 10
3.3 备份单表及分表备份... 11
3.4 备份多个表... 13
3.5 备份数据库表结构(不包含数据)... 13
3.6 备份表中数据... 14
3.7 小结... 15
3.8 刷新binlog的参数... 15
3.9 mysqldump的关键参数说明... 16
4. 生产场景不同引擎mysqldump备份命令... 18
5. 恢复数据库实践... 18
5.1 数据库恢复事项... 18
5.2 利用source命令恢复数据库... 18
5.3 利用mysql命令恢复(标准)... 20
5.4 针对压缩的备份文件恢复数据... 22
6. 实现和mysql非交互式对话... 23
6.1 利用mysql –e 参数查看mysql数据库... 23
6.2 利用mysql -e参数查看mysql变量及性能状态... 24
6.3 不重启数据库修改数据库参数... 25
6.4 生产场景常用重要命令小结... 26
7. mysqladmin命令
经常有网友问,运维工作到底是什么工作,到底做什么?其实,运维工作简单的概括就两件事,第一个是保护公司的数据,第二个是网站7*24小时提供服务。
而对于数据和网站7*24小时提供服务那个跟重要呢?
这个具体要看业务和公司。
例如:银行,金融行业,数据是最重要的,一条都不能丢,可能宕机停机影响就没那么大。
再例如:百度搜索,腾讯qq聊天记录丢失几万条数据,都不算啥。
对于数据来讲,数据最核心的就是数据库核数据,当然也包括其他数据,以下主要讲解的是数据库的数据。
对于绝大数企业来讲,时区数据就时区商机,时区产品,时区客户,公司倒闭…….,因此,数据库的备份与恢复就显得十分重要了。
备份的两种方式:
1. 逻辑备份:以SQL语句的形式,将数据导出,速度慢,跨平台,跨版本,可以跨软件。
2. 物理备份,直接对数据文件备份,cp tar,速度快,不容易跨平台、跨版本。跨软件,常用方法: linux备份工具(cp tar)。
3. xtrabackup
mysql数据库自带了一个很好用的备份命令,就是mysqldump,它的基本使用如下:
命令语法:mysqldump -u 用户名-p密码 数据库名 > 备份的文件名
如下5个范例目录:
(1)备份名字为oldboy数据库
(2)解决备份文件乱码问题
(3)利用上述备份数据进行回复测试
(4)备份时使用-B参数和不适用-B参数的区别及两种备份方法。
(5)优化使用—compact参数使备份文件不输出注释,优化空间。
(6)指定压缩命令压缩备份的MySQL数据
范例操作如下:
(1)范例1:备份名字为oldboy的库
1. 备份前查看oldboy数据
[root@db01 /]# mysql -U -uroot -poldboy123 -S /data/3306/mysql.sock -------- --------- mysql> show databases; +---------------------+ | Database | +---------------------+ | information_schema | | mysql | | oldboy | +---------------------+ 6 rows in set (0.00 sec) mysql> use oldboy Database changed mysql> show tables; +------------------+ | Tables_in_oldboy | +------------------+ | student | | test | +------------------+ 2 rows in set (0.00sec) mysql> select * from test; +------+---------+ | id | name | +------+---------+ | 3 | hehe | | 5 | kaka | | 1 |oldboy | | 2 | oldgirl | | 4 | zuma | +------+---------+ 5 rows in set (0.00sec) mysql> quit Bye
2. 在命令行执行备份命令
[root@db01 /]# mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboy>/opt/oldboy_$(date +%F).sql [root@db01 /]# ll /opt/oldboy_2016-08-28.sql -rw-r--r-- 1 rootroot 2700 Aug 28 23:25 /opt/oldboy_2016-08-28.sql
3. 备份完检查备份完的数据
[root@db01 /]# egrep -v ‘#|\*|--|^$‘/opt/oldboy_2016-08-28.sql DROP TABLE IF EXISTS`student`; CREATE TABLE `student`( `id` int(4) NOT NULL AUTO_INCREMENT, --------------------------------- INSERT INTO `test`VALUES (3,‘hehe‘),(5,‘kaka‘),(1,‘oldboy‘),(2,‘oldgirl‘),(4,‘zuma‘); UNLOCK TABLES;
提示:根据以上得出的结果,我们看看到已备份的表结构语句及插入的数据整合的sql语句。
(2)范例2:如果出现乱码指定字符集参数解决备份乱码问题
假如备份数据库备份文件出现乱码情况,用以下参数解决中文乱码,过程如下
1. 查看备份的数据库客户端及服务端的字符集设置
[root@db01 opt]#mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "show variableslike ‘%character%‘" +--------------------------+--------------------------------------------+ | Variable_name |Value | +--------------------------+--------------------------------------------+ | character_set_client | utf8 | |character_set_connection | utf8 | |character_set_database | utf8 | | character_set_filesystem | binary | |character_set_results | utf8 | |character_set_server | utf8 | |character_set_system | utf8 | |character_sets_dir | /application/mysql-5.5.49/share/charsets/ | +--------------------------+--------------------------------------------+
2. 指定对应的字符集备份,这里为--default-character_set=utf8 (指定字符集参数)
mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock - oldboy>/opt/oldboy_$(date +%F).sql
执行结果:
[root@db01 opt]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy >/opt/oldboy_$(date +%F).sql [root@db01 opt]# egrep -v ‘#|\*|--|^$‘ /opt/oldboy_2016-08-28.sql
提示:如果出现乱码情况,使用指定支付及查看,就不会在乱码了,其实,即使导出的中文乱码也没关系,导入数据库依然是正常的。
(3)范例2::利用上述备份好的文件进行数据恢复测试
[root@db01 opt]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock oldboy < /opt/oldboy_2016-08-28.sql [root@db01 opt]#mysql-uroot -poldboy123 -S /data/3306/mysql.sock -e "select * fromoldboy.test;" +--------+-----------+ | id | name | +--------+-----------+ | 3 | hehe | | 5 | kaka | | 1 | oldboy | | 2 | oldgirl | | 4 | zuma | +--------+-----------+
(4)范例4:备份时加-B参数以及使用备份文件恢复数据的两种方法
1. 查看不加-B参数备份文件和加-B备份文件区别
不加-B参数备份命令:
mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboy>/opt/oldboy_$(date +%F).sql
加-B参数备份命令:
mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboy >/opt/oldboy_B_$(date +%F).sql
使用vimdiff命令比较不加-B参数配置文件和加-B参数配置文件区别
[root@db01 /]# cd /opt/ [root@db01 opt]# vimdiff oldboy_2016-08-28.sql oldboy_B_2016-08-28.sql -- Current Database: `oldboy` -- --
# 结论:
直观看,加上-B参数的作用是增加创建数据库核连接数据库的语句了,我们使用-B的备份文件就可以直接恢复,而不适用-B的备份文件还需要先创建库才可以,区别即如下两条语句:
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `oldboy` USE `oldboy`;
第一种恢复数据(不加-B参数的备份数据护肤数据)
[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock mysql> show databases; +---------------------+ | Database | +---------------------+ | information_schema | | mysql | | oldboy | | performance_schema | +---------------------+ 6 rows in set (0.00sec) mysql> drop database oldboy; Query OK, 2 rowsaffected (0.11 sec) mysql> show databases; +----------------------+ | Database | +----------------------+ | information_schema | | mysql | | performance_schema | +----------------------+ 5 rows in set (0.00sec) mysql> quit Bye [root@db01 opt]# [root@db01 opt]#
说明:现在使用没有带-B参数备份的备份文件来恢复数据库,在上面已经跟加-B参数的备份文件做了对比,-B参数备份文件中比不带-B参数备份的文件多了创建oldboy数据库核进入oldbou数据库,就是说-B参数的备份文件为我们节省了创建库和进入库的两个步骤,直接将备份文件导入数据库即可,还不用指定那个库,因为里面指定了使oldboy数据库。
第二种备份文件恢复数据(使用加-B参数备份文件恢复)
[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "dropdatabase oldboy;" [root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showdatabases;" +---------------------+ | Database | +---------------------+ | information_schema | | mysql | | performance_schema | +---------------------+ [root@db01 opt]# [root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showdatabases;" +---------------------+ | Database | +---------------------+ | information_schema | | mysql | | | | performance_schema | +---------------------+
# 说明:在上面已经将加-B参数备份的配置文件和不加-B参数备份的配置文件进行对比和说明,加上-B参数在恢复数据时会自动建库并恢复数据,不加-B则还得先手动建库,所以这是加-B参数的好处,如果说详见一个数据库的数据拷贝到另一个库里可以不加-B参数,到时候直接将备份文件导入到该库即可。
提示:-B不仅只有自动建库use库的一键恢复库数据的应用,还可以指定多个库
(5)范例5:优化备份文件大小减少输出注释(debug调试)
利用mysqldump的—compact参数优化下备份结果:
[root@db01 opt]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock -B oldboy -----------------------
带--compact参数备份
mysqldump-uroot -poldboy123 -S /data/3306/mysql.sock -B oldboy --compact >/opt/oldboy_$(date +%F).sql egrep -v ‘#|\*|--|^$‘ /opt/oldboy_2016-08-28.sql
--compact参数说明:
注意:--compact此参数不在生产环境使用,用于调试即可。
(6)范例6:指定压缩命令压缩备份的MySQL数据
在将数据库数据备份时通过gzip命令压缩,以节省磁盘空间
mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -B oldboy|>/opt/oldboy_$(date +%F).sql. [root@db01 opt]# ll /opt/ total 24 -rw-r--r-- 1root root 2700 Aug28 23:25 oldboy_2016-08-28.sql -rw-r--r-- 1root root 897 Aug 29 01:55 oldboy_2016-08-29.sql.gz -rw-r--r-- 1root root 2843 Aug28 23:54 oldboy_B_2016-08-28.sql
以上例子小结:
1. 备份数据使用-B参数,会在备份数据中增加建库及use库的语句。
2. 备份数据使用-B参数,使得后面可以直接接多个库名。
3. 备份数据使用gzip对备份的数据压缩,可以节省磁盘空间。
4. debug时可以用—compact减少输出,但不用于生产。
5. 指定字符集备份用–default-character-set=字符集(一般不适用)
利用mysqldump命令备份数据的过程,实际上就是把数据从mysql库里以逻辑的sql语句的形式直接输出或者生成备份的文件的过程。
可否举一反三,利用这个备份文件恢复的时候的原理?
备份的数据过滤掉注释,都是SQL语句,结果如下:
[root@db01 opt]# egrep -v ‘#|\*|--|^$‘/opt/oldboy_2016-08-28.sql DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(4)NOT NULL AUTO_INCREMENT, `name`char(20) NOT NULL, `age` tinyint(2)NOT NULL DEFAULT ‘0‘, `dept`varchar(16) DEFAULT NULL, PRIMARY KEY(`id`), KEY`index_name` (`name`), KEY`index_name_dept` (`name`,`dept`), KEY`index_123` (`name`,`dept`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `student` WRITE; UNLOCK TABLES; DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(4)NOT NULL AUTO_INCREMENT, `name`char(20) NOT NULL, PRIMARY KEY(`id`), KEY`index_name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULTCHARSET=utf8; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES(3,‘hehe‘),(5,‘kaka‘),(1,‘oldboy‘),(2,‘oldgirl‘),(4,‘zuma‘); UNLOCK TABLES;
1. 查看当前有几个库
[root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock mysql> show databases; +----------------------+ | Database | +----------------------+ | information_schema | | 3ooo | | mysql | | oldboy | #<== 备份 | oldboy_gbk | #<== 备份 | performance_schema | +----------------------+ 6 rows in set (0.00 sec)
2 开始使用-B参数备份多个库
mysqldump-uroot -poldboy123 -S /data/3306/mysql.sock oldboy_gbkoldboy >/opt/bak_$(date +%F).sql.gz egrep -v ‘#|\*|--|^$‘/opt/bak_2016-08-29.sql.gz
-B参数说明:该参数用于导出若干个数据库,在备份结果中会加入CREATE DATABASE `db_name`和USE db `db_name`两个mysql数据库命令,-B后的参数都将被作为数据库名,该参数比较常用,当-B后的数据库列全时,用-A参数,-A参数意思是转储所有数据中的所有表。
分库备份实际上就是执行一个备份语句备份一个库,如果数据库里面有多个表,就执行多条相同的备份单个库的备份语句就可以备份多个库了,注意每个库都可以对应备份的库作为库名,结尾加sql,
分库意义: 举例,有时一个企业数据库里会有多个库,例如(www,bbs,blog),但是出问题时候的很可能是某一个库,如果在备份时把所有的库都备份成一个数据文件的话,恢复某一个库的数据时就比较麻烦了。
方法1:使用一条一条的命令备份:
mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock -B oldboy>/opt/……… mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock -B oldboy_gbk >/opt/........
方法二:利用命令拼接实现分库备份
[root@db01 ~]# mkdir /server/backup [root@db01 ~]# [root@db01 ~]# ls /server/backup/ 3ooo_2016-08-29.sql.gz oldboy_2016-08-29.sql.gz oldboy_gbk_2016-08-29.sql.gz
单标备份命令语法:mysqldump-u用户名 -p密码 数据库名 表名> 备份的文件名
(1)备份单个表:以下备份oldboy数据库的test表为例
1. 备份前查看oldboy数据库有那些表
[root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show tables from oldboy;" +-----------------+ | Tables_in_oldboy| +-----------------+ | student | | test | +-----------------+
2. 开始备份单个表(test)表
[root@db01 ~]# [root@db01 ~]# egrep -v ‘#|\*|--|^$‘/opt/tables.sql DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(4)NOT NULL AUTO_INCREMENT, `name`char(20) NOT NULL, `age`tinyint(2) NOT NULL DEFAULT ‘0‘, `dept`varchar(16) DEFAULT NULL, PRIMARY KEY(`id`), KEY`index_name` (`name`), KEY`index_name_dept` (`name`,`dept`), KEY`index_123` (`name`,`dept`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `student` WRITE; UNLOCK TABLES;
(2)一条命令分表备份:
数据库分表备份其实就是一条一条的备份,但是又时候一条命令一条命令麻烦,可以使用一条命令将多个数据库表备份,这样更简洁,以下将student和test表备份使用一条命令,具体命令如下:
[root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show tables from oldboy;" #<== 备份前查看当前oldboy数据库中有哪些表 +------------------+ | Tables_in_oldboy | +------------------+ | student | | test | +------------------+ - [root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show tables from oldboy;"|egrep -v"Tables_in_oldboy"|sed -r ‘s#(.*)#mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy \1 >/opt/\1_tables.sql #g‘ mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboystudent >/opt/student_tables.sql mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy test >/opt/test_tables.sql [root@db01 ~]# [root@db01 ~]# ll -rt /opt/|tail -2 -rw-r--r-- 1root root 2010 Aug 29 12:18 student_tables.sql -rw-r--r-- 1root root 1941 Aug 29 12:18 test_tables.sql
分表备份的缺点
1.被一个完整全被,在做一个分库分表备份。
2. 脚本批量恢复SQL文件
面试题:多个库或者多个表备份到一块,如何恢复单个库或者表?
解答:
a. 第三方测试库,导入到库里,然后把需要的备份出来,最后恢复到正式库里。
b. 单表:grep 表名 bak.sql> 表名.sql
单库:循环过滤库里所有表,grep表名 bak.ssql > 表名.sql(多个表数据)
c. 实现分库分表备份。
以下备份oldboy数据库的多个表
1.查看oldboy数据库中的表,命令如下:
mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showtables from oldboy;"
2. 备份oldboy数据库中的student、test两个表,命令如下
mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock >/opt/tables.sql
说明:备份多个表时在oldboy数据库后面指定多个表即可,不需要加-B参数!
命令语法:mysqldump -u用户 -p密码数据库名 表名 -d > 备份文件名
利用mysqldump –d参数值备份数据库里面的表结构,
(1)备份oldboy库的所有表的结构:
备份前输出且过检查
[root@db01 3306]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboytest -d –compact , /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(4)NOT NULL AUTO_INCREMENT, `name`char(20) NOT NULL, PRIMARY KEY(`id`), KEY`index_name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULTCHARSET=utf8; /*!40101 SET character_set_client =@saved_cs_client */;
2.. 以上输出正确后将其输出到备份文件中进行备份(备份全部表结果),命令如下
mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy -d>/opt/bak_oldboy.sql
命令语法:mysqldump-u用户 -p密码数据库名 表名 -t > 备份文件名
1. 备份oldboy库中test表前输出查看数据是否想要的
[root@db01 3306]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy test -t --compact INSERT INTO `test` VALUES(3,‘hehe‘),(5,‘kaka‘),(1,‘oldboy‘),(2,‘oldgirl‘),(4,‘zuma‘);
2. 以上结果正确开始备份
mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy test >/opt/bak_test.sql
使用--tab参数备份的表结构和数据分离
[root@db01 3306]# mysqldump-uroot -poldboy123 -S /data/3306/mysql.sock oldboy test --compact [root@db01 3306]# ls /tmp/ a.txt b.txt
说明:通过以上的分离后,数据表和sql语句就分开备份了,一个是文本一个是sql语句
-B备份多个库(并添加create和use库的语句)。
-d值备份库表结构。
-t只备份数据(sql语句形式)。
-T分离库表和数据成不同的文件,数据是文本,非SQL语句。
binlog是什么?是记录数据库更新的SQL语句。二进制文件
mysqldump用于定时对某一时刻的数据的全备,例如:00点进行bak.sql.gz
增量备份,当有数据写入到数据库时,还会同时更新的·SQL语句写入到对应的文件里。这个文件就叫做binlog文件。
例如10点丢失数据需要恢复数据:
1. 00点时刻备份的bak.sql.gz数据还原到数据库,这个时候数据恢复到了00点。
2. 00点到10::00数据,就要从binlog里恢复
binglog文件生效需要一个参数:log-bin
个人理解:我们平时对数据库进行备份时定时备份,而不是实时备份数据,假设我们数据库北田在晚上00点备份,而我早上8点数据库出现故障导致数据丢失时,我们怎么去找回00点到8点这之间的数据呢?那就要通过binlog文件啦,而binlog文件会切割的,但是在瓦上备份00点前我们是不需要的,所以在备份时要进行刷险binlog文件,重新生成,就是说重新生成的binlog是00-8:00之间的我们需要,需要靠这之间的binlog去恢复数据,
备份刷新binlog是binlog重新生成需要使用-F参数,生成新的binlog文件
下面测试:
[root@db01 3306]#ll /data/3306/ -rw-rw---- 1 mysqlmysql 2547 Aug 28 15:11 mysql-bin.000001 -rw-rw---- 1 mysqlmysql 6282 Aug 29 01:15 mysql-bin.000002 [root@db01 3306]#mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboy test >/opt/bak_test.sql [root@db01 3306]#ll /data/3306/ -rw-rw---- 1 mysqlmysql 2547 Aug 28 15:11 mysql-bin.000001 -rw-rw---- 1 mysqlmysql 6282 Aug 29 01:15 mysql-bin.000002 -rw-rw---- 1 mysqlmysql 150 Aug 29 15:47 mysql-bin.000003
binlog日志切割,确定全备和增量备份的临界点。
-F刷新binlog日志,生成新文件,将来增量恢复从这个文件开始,