八、数据备份与恢复

文章详细介绍了MySQL数据库的多种备份方法,包括使用mysqldump命令进行全量和部分备份,直接复制数据目录,以及Percona-xtrabackup工具进行完整、增量和差异备份。同时,文章也讨论了数据恢复的步骤,如使用mysql命令和直接复制数据目录恢复,以及数据迁移和表的导入导出操作。
摘要由CSDN通过智能技术生成

一、数据备份

1、使用 mysqldump 命令备份

(1)使用mysqldump 备份单个数据库中的所有表。

(2)使用mysqldump 备份数据库中的某个表

(3)使用mysqldump 备份多个数据库

2、直接复制真个数据库数据目录

二、数据恢复

1、使用 mysql 命令恢复

2、直接复制这个数据库数据目录

三、相同版本数据迁移

四、表的导出和导入

1、使用 select … into outfile 导出文件

2、使用 mysqldump 命令导出文本文件

3、使用mysql 命令导出文本文件

4、使用 load data infile 方式导入文本文件

5、使用mysqlimport 命令导入文本文件

五、mysql 5.7 的三种备份(8.0其中两种也能用)

  • 完全备份
  • 增量备份
  • 差异备份

1、Percona-xtrabackup备份案例

1)软件包安装

2)完全备份

3)增量备份:先做完整备份,在做增量备份

4)差异备份:先做完整备份,在做差备份

2、Mysqldump+binlog备份案例(8.0也可以用)

1)原理:锁表机制,可以做到热备

2)备份流程

3)删除数据流程

4)恢复流程

3、记录的导入导出(8.0也可以用)

1)记录导出

2)记录导入


一、数据备份

1、使用 mysqldump 命令备份

mysqldump  -u user -h host -p'password'  dbname  [ tbname,[tbname ... ] ] > filename.sql
  • user 用户名
  • host 主机名称
  • password 登录密码
  • dbname 数据库名
  • tbname 表名称,可以指定同一个database 中的多个表
  • filename.sql 备份文件的名称。

(1)使用mysqldump 备份单个数据库中的所有表。

mysqldump -u root -p booksdb  > booksdb_bak.sql

(2)使用mysqldump 备份数据库中的某个表

mysqldump  -u root -p  bookdb  tbname1,tbname2 > bookdb_bak.sql

(3)使用mysqldump 备份多个数据库

mysqldump -u root -h host -p  --databases  dbname1,dbname2  > filename.sql
  • –databases 最少跟一个数据库名称

2、直接复制真个数据库数据目录

默认是这个路径:/var/lib/mysql

二、数据恢复

1、使用 mysql 命令恢复

muysql -u root -p dbname  < filenmae.sql

或者
如果登录了mysql服务器可以用如下命令

mysql>  source filename

2、直接复制这个数据库数据目录

默认是这个路径:/var/lib/mysql

三、相同版本数据迁移

mysqldump  -h www.bac.com  -u root -ppasswd  dbname  |   myql  -h www.bcd.com  -u root -ppasswd
  • “|” 是管道符,mysqldump 通过管道符传给www.bcd.com 主机,如果要迁移全部数据库,可以使用使用参数 --all-databases。

四、表的导出和导入

1、使用 select … into outfile 导出文件

select  columnlist  from  table  where condition into outfile  'filename'  [ options]

--options 选项
fields  terminated by  'value'
fields  [ optionally ]  enclosed  by  'value'
fields  escaped  by  'value'
lines  starting  by 'value'
lines  terminated  by  'value'
  • filename 为外部文件名称
  • fields terminated by ‘value’ 设置字段之间的分隔符,可以为单个或多个字符,默认为制表符 ‘\t’。
  • fields [ optionally ] enclosed by ‘value’ 设置字段的包围符,只能为单个字符,如果使用了 [ optionally ] ,则只能是使用 char 和 vachar 等字符数据字段被包围,int 的字段不会被包围。
  • fields escaped by ‘value’ 设置如何写入或读取特殊字符,可以为单个或多个字符,默认值 ‘\’。
  • lines starting by ‘value’ 设置每行数据开头的字符,可以为单个或多个字符,默认情况下不使用任何字符。
  • lines terminated by ‘value’ 设置每行数据结尾的字符,可以为单个或多个字符,默认值 ‘\n’ 。

注:如果 fields 和 lines 都使用了,则 fields 必须在 lines 前。
注:如果数据为空,则显示 \N 。\ 是转义字符,N 是NULL

案例:

mysql> select * from tb_emp8 into outfile 'tb_emp8_bak20220108.sql'
    -> fields 
    -> terminated by  ','
    -> optionally  enclosed  by  '\"';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

1)直接写入会报错,要写绝对路径,要有写入权限,下面查看默认写入路径

mysql> show global variables like "%secure%";
+--------------------------+-----------------------+
| Variable_name            | Value                 |
+--------------------------+-----------------------+
| require_secure_transport | OFF                   |
| secure_file_priv         | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
2 rows in set (0.01 sec)

2)如果要更改默认写入路径,则进入配置文件修改如下参数

secure-file-priv="/var/lib/mysql-files/ "

3)继续导出

mysql> select * from tb_emp8 into outfile '/var/lib/mysql-files/tb_emp8_bak20220108.sql'
    -> fields
    -> terminated by  ','
    ->  optionally  enclosed  by  '\"';
Query OK, 3 rows affected (0.00 sec)

4)查看内容

[root@192 mysql]# cat /var/lib/mysql-files/tb_emp8_bak20220108.sql | more
1,"lucy",\N,100
2,"lura",\N,1200
3,"kevin",\N,1500

2、使用 mysqldump 命令导出文本文件

mysqldump -T  path -u root -p dbname [tables]  [options]

--options 选项
--fields-terminated-by=value
--fields-enclosed-by=value
--fields-optionally-enclosed-by=value
--fields-escaped-by=value
--lines-terminated-by=value
  • 只有指定了 -T 参数才能导出纯文本文件
  • path 表示导出数据目录
  • table 指定导出表,如果不指定,就会导出该数据库的所有表
  • –fields-terminated-by=value 设置字段之间的分隔符,可以为单个或多个字符,默认为制表符 “\t”。
  • –fields-enclosed-by=value 设置字段的包围字符。
  • –fields-optionally-enclosed-by=value 设置字段之间的包围字符,只能为单个字符、只能包括 char 和 varchar 等字段数据。
  • –fields-escaped-by=value 控制如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认为“\”。
  • –lines-terminated-by=value 设置每行数据结尾的字符,可以为单个多个字符,默认值为“\n”。

注:会生成俩个文件:filename.txt 和 filename.sql ,filename.txt 是文件内容, filename.sql 是表的创建等语句

案例:

[root@192 mysql]# mysqldump -T /root  test_db  tb_emp8 -u root -p  --fields-terminated-by=,  --fields-optionally-enclosed-by=\"
Enter password: 
mysqldump: Got error: 1290: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement when executing 'SELECT INTO OUTFILE'
[root@192 mysql]# mysqldump -T /var/lib/mysql-files/  test_db  tb_emp8 -u root -p  --fields-terminated-by=,  --fields-optionally-enclosed-by=\"
Enter password: 
[root@192 mysql]# ls /var/lib/mysql-files/
tb_emp8_bak20220108.sql  tb_emp8.sql  tb_emp8.txt
[root@192 mysql]# cat /var/lib/mysql-files/tb_emp8.sql | more
-- MySQL dump 10.13  Distrib 8.0.27, for Linux (x86_64)
--
-- Host: localhost    Database: test_db
-- ------------------------------------------------------
-- Server version	8.0.27

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `tb_emp8`
--

DROP TABLE IF EXISTS `tb_emp8`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tb_emp8` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  `deptId` int DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
[root@192 mysql]# cat /var/lib/mysql-files/tb_emp8.txt | more
1,"lucy",\N,100
2,"lura",\N,1200
3,"kevin",\N,1500
[root@192 mysql]# 

3、使用mysql 命令导出文本文件

[root@192 mysql]# mysql  -uroot -p  --execute='select 语句' dbname  dbname > filename.txt

如果想记录到 html 文件中要加 --html 参数
  • dbname 导出数据库的名称

4、使用 load data infile 方式导入文本文件

load data  infile 'filename.txt'  into table tablename  [ options ]  [ ignore  number lines ]

-- options 选项
fields  terminated  by 'value'
fields  [ optionally ]  enclosed  by  'value'
fields  escaped by 'value'
lines  starting by  'value'
lines  terminated  by  'value'
  • fields terminated by ‘value’ 设置字段之间的分隔符,可以为单个字符或多个字符,默认为制表符“\t”。
  • fields [ optionally ] enclosed by ‘value’ 设置字段的包围字符,只能为单个字符,如果使用了 optionally 参数,则只有char 和 varchar 等字符数据字段被包括。
  • fields escaped by ‘value’ 控制如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认值“\”
  • lines starting by ‘value’ 设置每行数据开头的字符,可以为单个或多个字符,默认情况下不使用任何字符。
  • lines terminated by ‘value’ 设置每行数据结尾的字符,可以为单个或多个字符,默认值 ‘\n’ 。
  • ignore number lines 忽略前number 行

案例

load  data  infile "/var/lib/mysql-files/tb_emp8.txt"  into table  test_db.tb_emp8

注:要提前建立这个表

5、使用mysqlimport 命令导入文本文件

mysqllimport  -u root  -p  dbname  filename.txt  [ options ]  

--options 选项
--fields-terminated-by=value
--fields-enclosed-by=value
--fields-optionally-enclosed-by=value
--fields-escaped-by=value
--lines-terminated-by=value
--ignore-lines=n
  • –fields-terminated-by=value 设置字段之间的分隔符,可以为单个或多个字符,默认为制表符 “\t”。
  • –fields-enclosed-by=value 设置字段的包围字符。
  • –fields-optionally-enclosed-by=value 设置字段之间的包围字符,只能为单个字符、只能包括 char 和 varchar 等字段数据。
  • –fields-escaped-by=value 控制如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认为“\”。
  • –lines-terminated-by=value 设置每行数据结尾的字符,可以为单个多个字符,默认值为“\n”。
  • –ignore-lines=n 忽视数据文件的前n行

案例

mysqlimport  -u root -p test_db  /var/lib/mysql-files/tb_emp8.txt 

五、mysql 5.7 的三种备份(8.0其中两种也能用)

  • 完全备份
  • 增量备份
  • 差异备份

1、Percona-xtrabackup备份案例

1)软件包安装

1、安装yum源:

#yum install -y  https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

2、安装两个相关的软件工具包

# yum install -y yum-utils // 第一个包
# yum repolist all | grep mysql //查看版本号
# yum-config-manager --disable mysql80-community // 禁用80
# yum-config-manager --enable mysql57-community // 开启57
# yum install mysql-community-libs-compat -y // 第二个包

3、安装Percona-xtrabackup软件

# yum  -y  install  percona-xtrabackup-24.x86_64

4、查询结果:

rpm   -ql   percona-xtrabackup-24.x86_64

2)完全备份

1、备份流程
(1)设置备份到/xtrabackup/full(自己创建的)

# innobackupex --user=root --password='Huawei@123' /xtrabackup/full

(2)查看备份文件、二进制文件;

 # ls /xtrabackup/full/
# ls /xtrabackup/full/2017-08-01_00-00-02/
# cat /xtrabackup/full/2017-08-01_00-00-18/xtrabackup_binlog_info 

2、模拟磁盘损坏

 # systemctl stop  mysqld
# rm  -rf  /var/lib/mysql/*
# rm  -rf  /var/log/mysqld.log

3、恢复流程
(1)生成回滚日志(指定回滚备份)

# innobackupex --apply-log /xtrabackup/full/2017-08-01_00-00-18/

(2)恢复文件

# innobackupex --copy-back /xtrabackup/full/2017-08-01_00-00-18/

(3)改变文件权限

# chown -R mysql.mysql /var/lib/mysql

(4)开启MySQL:systemctl start mysqld
(5)登录验证:mysql -uroot -p’Huawei@123’

3)增量备份:先做完整备份,在做增量备份

一、备份流程

(1)备份周二:
1、添加数据:

# mysql -uroot -p’Huawei@123’ -e ‘insert into testdb.text  values(2)’

2、修改时间:data 09020000
3、基于上次的完整备份,开始备份。

innobackupex --user=root --password='Huawei@123' 
--incremental /xtrabackup/ 
--incremental-basedir=/xtrabackup/2017-09-01_00-00-04

4、查看备份数据:

# ls /xtrabackup/

2)备份周三:
1、添加数据:

# mysql -uroot -p’Huawei@123’ -e ‘insert into testdb.text  values(2)’

2、修改时间:data 09030000
3、基于上次的完整备份,开始备份。

innobackupex --user=root --password='Huawei@123' 
--incremental /xtrabackup/ 
--incremental-basedir=/xtrabackup/2017-09-01_00-02-04

4、查看备份数据:

ls /xtrabackup/
二、删库流程:
# systemctl stop  mysqld
# rm  -rf  /var/lib/mysql/*
# rm  -rf  /var/log/mysqld.log
三、恢复流程:

1)生成回滚日志(指定回滚备份):

周一:innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
周二: innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04  --incremental-dir=/xtrabackup/2017-09-02_00-00-26

2)恢复文件:

# innobackupex --copy-back /xtrabackup/2017-09-01_00-00-06

3)改变文件权限:# chown -R mysql.mysql /var/lib/mysql
4)开启MySQL:systemctl start mysqld
5)登录验证:

4)差异备份:先做完整备份,在做差备份

【注】设置备份时,基于第一次完整备份,恢复数据时,快速恢复。

一、备份流程:

1)备份周二:
1、添加数据:

# mysql -uroot -p’Huawei@123’ -e ‘insert into testdb.text  values(2)’

2、修改时间:data 09020000
3、基于上次的完整备份,开始备份。

 innobackupex --user=root --password='Huawei@123' 
--incremental /xtrabackup/ 
--incremental-basedir=/xtrabackup/2017-09-01_00-00-04

4、查看备份数据:# ls /xtrabackup/
2)备份周三:
1、添加数据:

# mysql -uroot -p’Huawei@123’ -e ‘insert into testdb.text  values(2)’

2、修改时间:data 09030000
3、基于上次的完整备份,开始备份。

innobackupex --user=root --password='Huawei@123' 
--incremental /xtrabackup/ 
--incremental-basedir=/xtrabackup/2017-09-01_00-02-04

4、查看备份数据:ls /xtrabackup/

二、删库流程:
# systemctl stop  mysqld
# rm  -rf  /var/lib/mysql/*
# rm  -rf  /var/log/mysqld.log
三、恢复流程:

1)生成回滚日志(指定回滚备份):

周一:innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
周二: innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04  --incremental-dir=/xtrabackup/2017-09-02_00-00-26

2)恢复文件:

# innobackupex --copy-back /xtrabackup/2017-09-01_00-00-06 

3)改变文件权限:# chown -R mysql.mysql /var/lib/mysql
4)开启MySQL:systemctl start mysqld
5)登录验证:

2、Mysqldump+binlog备份案例(8.0也可以用)

1)原理:锁表机制,可以做到热备

2)备份流程

1、执行备份:

[root@localhost ~]# mysqldump -p'Huawei@123' \
--all-databases --single-transaction \
--master-data=2 \
--flush-logs \
> /backup/`date +%F-%H`-mysql-all.sql   //重定向

2、查看细节:

   vim /backup/2016-11-25-14-mysql-all.sql
   LOCK  TABLES  `user`  WRITE; //观察各种锁记录,保证书一致性

3)删除数据流程

1、备份二进制日志文件:cp /var/lib/mysql/bin ~
2、停止MySQL、删库

# systemctl   stop  mysqld
# rm -rf  /var/lib/mysql/*

3、启动数据库,改密码

# systemctl start mysqld 
# grep 'password' /var/log/mysqld.log
# mysqladmin -uroot -p'Kyzw;u2dq<mh' password 'Huawei@1234'

4)恢复流程

1、MySQL恢复:

# mysql -p'Huawei@1234' < /backup/2016-12-08-04-mysql-all.sql
# mysql -p'Huawei@1234' -e 'flush privileges'

2、二进制日志恢复:

mysqlbinlog localhost-bin.000002 localhost-bin.000003
--start-position=154 | mysql -p'Huawei@123'

【注】localhost-bin.000003、start-position=154可以用 # show master status\G;自动生成日志位置。

3、记录的导入导出(8.0也可以用)

1)记录导出

1、修改配置文件–信任目录:

# vim  /etc/my.cnf
Secure-file-priv=/backup   //MySQL不信任该文件,重启MySQL。
# chown  mysql.mysql   /backup

2、导出文件到/backup:

# mysql> SELECT * FROM testdb1.t1 INTO OUTFILE '/backup/testdb1.t1.txt';

3、三种不同的文件导出方式:

# mysql -u root -p'Huawei@123' --html -e 'select * from testdb1.t1' > /backup/index.html
# mysql -u root -p'Huawei@123' --xml -e 'select * from testdb1.t1' > /backup/testdb1.t3.txt
# mysql -uroot -p'Huawei@123' -e 'select * from testdb1.t1' > /backup/testdb1.t2.txt

2)记录导入

1、修改权限:

# vim /etc/my.cnf
secure-file-priv=/backup //MySQL不信任该文件,重启MySQL程序
# chown mysql.mysql /backup

2、导入文件:
读取记录备份文件:

#LOAD DATA INFILE '/backup/testdb1.t1.txt' INTO TABLE testdb1.t1;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值