您的位置:首页 > 运维架构 > Linux

mysql 数据库完全备份与恢复-centos7.1

2019-05-14 21:15 615 查看
版权声明:本博客供大家交流,欢迎各抒己见,博文中内容禁止用于任何商业目的。如需转载博文,请尊重版权,注明本博客网址 https://blog.csdn.net/weixin_44879253/article/details/90215277

 

【centos7.5】

一、mysql完全备份操作

mysql数据库的备份可以采用多种方式

1.1 直接打包数据库文件夹,如/usr/local/mysql/data /var/lib/mysql

[root@mysql ~]# mysql -uroot -p

Enter password:123123

mysql> show databases;【查看表已经有auth数据库】

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| imployee_salary    |

| libai              |

| mysql              |

| performance_schema |

| test               |

+--------------------+

7 rows in set (0.08 sec)

mysql> use auth

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> select * from users;【查看user表已经有用户,】

+-----------+--------------------------------+

| user_name | user_passwd                    |

+-----------+--------------------------------+

| li        | *6BB4837EB74329105EE4568DDA7DC |

| root      | *6BB4837EB74329105EE4568DDA7DC |

| zhang     | *6BB4837EB74329105EE4568DDA7DC |

| zhangsan  | *E56A114692FE0DE073F9A1DD68A00 |

+-----------+--------------------------------+

4 rows in set (0.00 sec

mysql> quit

Bye

[root@mysql ~]# /etc/init.d/mysqld stop【关闭mysql,为后面做准备】

 ERROR! MySQL server process #14704 is not running!

[root@mysql ~]# rpm -q xz【确保有这个后缀包】

xz-5.1.2-9alpha.el7.x86_64

[root@mysql ~]# tar Jcf mysql_all-$(date +%F).tar.xz /usr/local/mysql/data/【把data/文件打包再压缩,此处为J大写】

tar: 从成员名中删除开头的“/”

 [root@mysql ~]# ls【查看打包成功】

all-data.sql     auth.sql            mysql-5.5.22.tar.gz          mysql-user.sql

anaconda-ks.cfg  cmake-2.8.6.tar.gz  mysql_all-2019-05-11.tar.xz

[root@mysql ~]# mkdir bak

【模拟数据丢失】

[root@mysql ~]# mv /usr/local/mysql/data/* bak/

【恢复数据】

[root@mysql ~]# tar xf mysql_all-2019-05-13.tar.xz

[root@mysql ~]# ls【解压到这儿了。路径不对】

all-data.sql     bak                  mysql_all-2019-05-13.tar.xz

anaconda-ks.cfg  cmake-2.8.6.tar.gz   mysql-user.sql

auth.sql         mysql-5.5.22.tar.gz  usr

[root@mysql ~]# cd usr/local/mysql/data/

[root@mysql data]# mv * /usr/local/mysql/data/

[root@mysql data]# /etc/init.d/mysqld restart

 ERROR! MySQL server process #4989 is not running!

Starting MySQL.. SUCCESS!

mysql> select * from auth.users;

+-----------+--------------------------------+

| user_name | user_passwd                    |

+-----------+--------------------------------+

| li        | *6BB4837EB74329105EE4568DDA7DC |

| root      | *6BB4837EB74329105EE4568DDA7DC |

| zhang     | *6BB4837EB74329105EE4568DDA7DC |

| zhangsan  | *E56A114692FE0DE073F9A1DD68A00 |

+-----------+--------------------------------+

4 rows in set (0.00 sec)

 

1.2 使用专用备份工具mysqldump

1.2.1 对单个库进行完全备份

格式:mysqldump -u 用户名 -p  [密码] [选项]  [数据库名] >  /备份路径/备份文件名

[root@mysql ~]# mkdir /backup

[root@mysql ~]# mysqldump -uroot -p123123 auth > /backup/auth-$(date +%Y%m%d).sql

[root@mysql ~]# echo $?【代表上一个命令执行后的退出状态】

0

[root@mysql ~]# cat /backup/auth-20190513.sql

-- MySQL dump 10.13  Distrib 5.5.22, for Linux (x86_64)

--

-- Host: localhost    Database: auth

-- ------------------------------------------------------

-- Server version 5.5.22-log

-- Dump completed on 2019-05-13 13:47:42

1.2.2 对多个库进行完全备份

格式:mysqldump -u 用户名 -p [密码]  [选项] --databases 库名1 [库名2]... > /备份路径/备份文件名

[root@mysql ~]# mysqldump -uroot -p123123 --databases mysql auth > /backup/mysql+auth-$(date +%Y%m%d).sql

[root@mysql ~]# cat /backup/mysql+auth-20190513.sql【出现很多数据】

 

1.2.3 对所有库进行完全备份

格式:mysqldump -u 用户名 -p  [密码] [选项] --all-databases > /备份路径/备份文件名

[root@mysql ~]# mysqldump -uroot -p123123 --opt --all-databases > /backup/mysql_all.$(date +%Y%m%d).sql【--opt  加快备份速度,当备份数据量大时使用】

[root@mysql ~]# cat /backup/mysql_all.20190513.sql【出现更多的数据】

 

1.2.4对表进行完全备份

格式:mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名

[root@mysql ~]# mysqldump -uroot -p123123 auth users >/backup/auth_user-$(date +%Y%m%d).sql

[root@mysql ~]# cat /backup/auth_user-20190513.sql【出现更多的数据】

1.2.5 对表结构的备份

格式:mysqldump -u 用户名 -p [密码]  -d  数据库名  表名 > /备份路径/备份文件名

[root@mysql data]# mysqldump -uroot -p123123 -d mysql user >/backup/desc_mysql_user-$(date +%Y%m%d).sql

[root@mysql data]# cat /backup/desc_mysql_user-20190513.sql【出现很多数据】

[root@mysql backup]# ls【备份的所有数据】

auth-20190513.sql             mysql_all.20190513.sql

auth_user-20190513.sql        mysql+auth-20190513.sql

desc_mysql_user-20190513.sql

二、使用mysqldump备份后,恢复数据库

2.1  source 命令

登录到mysql数据库

执行source 备份 sql 脚本路径

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| haoli              |

| imployee_salary    |

| libai              |

| mysql              |

| performance_schema |

| test               |

+--------------------+

8 rows in set (0.00 sec)

mysql> drop database auth;【删除auth库】

Query OK, 1 row affected (0.05 sec)

mysql> show databases;【查看auth不存在】

+--------------------+

| Database           |

+--------------------+

| information_schema |

| haoli              |

| imployee_salary    |

| libai              |

| mysql              |

| performance_schema |

| test               |

+--------------------+

7 rows in set (0.00 sec)

mysql> source /backup/mysql_all.20190513.sql【注意此处没有分号;】【恢复auth库】

Query OK, 0 rows affected (0.03 sec)

.............................................

mysql> show databases;【auth库恢复成功】

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| haoli              |

| imployee_salary    |

| libai              |

| mysql              |

| performance_schema |

| test               |

+--------------------+

8 rows in set (0.00 sec)

2.2  mysql命令

格式:mysql -u 用户名 1aa70 -p [密码] < 库备份脚本的路径

      mysql  -u  用户名 -p  [密码] 库名 <  表备份脚本的路径

[root@mysql ~]# mysql -uroot -p123123 -e 'show databases;'

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| haoli              |

| imployee_salary    |

| libai              |

| mysql              |

| performance_schema |

| test               |

+--------------------+

[root@mysql ~]# mysql -uroot -p123123 -e 'drop database auth;'【删除auth库】

[root@mysql ~]# mysql -uroot -p123123 -e 'show databases;'【auth已经不存在】

+--------------------+

| Database           |

+--------------------+

| information_schema |

| haoli              |

| imployee_salary    |

| libai              |

| mysql              |

| performance_schema |

| test               |

+--------------------+

【方法一】

[root@mysql ~]# mysql -uroot -p123123 </backup/mysql_all.20190513.sql【恢复auth库】

[root@mysql ~]# mysql -uroot -p123123 -e 'show databases;'【再次查看auth】

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| haoli              |

| imployee_salary    |

| libai              |

| mysql              |

| performance_schema |

| test               |

+--------------------+

【方法二】

[root@mysql ~]# mysql -uroot -p123123 -e 'create database auth;'【先创建auth】

[root@mysql ~]# mysql -uroot -p123123  auth < /backup/auth-20190513.sql【恢复数据库auth】

[root@mysql ~]# mysql -uroot -p123123 -e 'select * from auth.users;'【查看auth表】

+-----------+--------------------------------+

| user_name | user_passwd                    |

+-----------+--------------------------------+

| li        | *6BB4837EB74329105EE4568DDA7DC |

| root      | *6BB4837EB74329105EE4568DDA7DC |

| zhang     | *6BB4837EB74329105EE4568DDA7DC |

| zhangsan  | *E56A114692FE0DE073F9A1DD68A00 |

+-----------+--------------------------------+

[root@mysql ~]# mysql -uroot -p123123 -e 'drop  table auth.users;'【删除auth表】

[root@mysql ~]# mysql -uroot -p123123 -e 'select * from auth.users;'【查看auth表报错,因为没有这个表】

ERROR 1146 (42S02) at line 1: Table 'auth.users' doesn't exist

[root@mysql ~]# mysql -uroot -p123123 auth</backup/auth_user-20190513.sql【恢复auth表】

[root@mysql ~]# mysql -uroot -p123123 -e 'select * from auth.users;'【查看auth表恢复成功】

+-----------+--------------------------------+

| user_name | user_passwd                    |

+-----------+--------------------------------+

| li        | *6BB4837EB74329105EE4568DDA7DC |

| root      | *6BB4837EB74329105EE4568DDA7DC |

| zhang     | *6BB4837EB74329105EE4568DDA7DC |

| zhangsan  | *E56A114692FE0DE073F9A1DD68A00 |

+-----------+--------------------------------+

 

三、mysql完全备份案例

3.2 创建数据及表,录入数据

mysql> create database client;

Query OK, 1 row affected (0.00 sec)

mysql> use client;

Database changed

mysql> show variables like 'character_set_%';【查看字符集是否支持中文】

+--------------------------+----------------------------------+

| 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       | /usr/local/mysql/share/charsets/ |

+--------------------------+----------------------------------+

8 rows in set (0.00 sec)

mysql> create table user_info(身份证 int(20),姓名 char(20),性别 char(2),用户ID号 int(110),资费 int(10));

Query OK, 0 rows affected (0.38 sec)

mysql> insert into user_info values('000000001','小春','男','011','101');

Query OK, 1 row affected (0.01 sec)

mysql> insert into user_info values('000000002','小夏','男','012','102');

Query OK, 1 row affected (0.01 sec)

mysql> insert into user_info values('000000003','小秋','男','013','103');

Query OK, 1 row affected (0.01 sec)

mysql> insert into user_info values('000000004','小冬','女','014','104');

Query OK, 1 row affected (0.01 sec)

mysql> insert into user_info values('000000005','小小','女','015','105');

Query OK, 1 row affected (0.01 sec)

mysql> select * from user_info;

+-----------+--------+--------+-------------+--------+

| 身份证    | 姓名   | 性别   | 用户ID号    | 资费   |

+-----------+--------+--------+-------------+--------+

|         1 | 小春   | 男     |          11 |    101 |

|         2 | 小夏   | 男     |          12 |    102 |

|         3 | 小秋   | 男     |          13 |    103 |

|         4 | 小冬   | 女     |          14 |    104 |

|         5 | 小小   | 女     |          15 |    105 |

+-----------+--------+--------+-------------+--------+

5 rows in set (0.00 sec)

3.3 完整备份client.user_info

[root@mysql ~]# mysqldump -uroot -p123123 client user_info >/backup/client.user_info-$(date +%Y%m%d).sql

[root@mysql ~]# ls /backup/

auth-20190513.sql       client.user_info-20190513.sql  mysql_all.20190513.sql

auth_user-20190513.sql  desc_mysql_user-20190513.sql   mysql+auth-20190513.sql

3.4 模拟数据丢失恢复数据

[root@mysql ~]# mysql -uroot -p123123 -e 'drop table client.user_info;' 【删除client的表】

[root@mysql ~]# mysql -uroot -p123123 -e 'use client;show tables;' 【查看client的表为空】

[root@mysql ~]# mysql -uroot -p123123 client </backup/client.user_info-20190513.sql 【恢复client表】

[root@mysql ~]# mysql -uroot -p123123 -e 'select * from client.user_info;' 【查看client表】

+-----------+--------+--------+-------------+--------+

| 身份证    | 姓名   | 性别   | 用户ID号    | 资费   |

+-----------+--------+--------+-------------+--------+

|         1 | 小春   | 男     |          11 |    101 |

|         2 | 小夏   | 男     |          12 |    102 |

|         3 | 小秋   | 男     |          13 |    103 |

|         4 | 小冬   | 女     |          14 |    104 |

|         5 | 小小   | 女     |          15 |    105 |

+-----------+--------+--------+-------------+--------+

3.5 定期备份数据

[root@mysql ~]# which mysqldump

/usr/local/mysql/bin/mysqldump

[root@mysql ~]# vi /opt/bak_client.sh

#!/bin/bash

#备份 client.user_info 表 脚本

/usr/local/mysql/bin/mysqldump -uroot -p123123 client user_info >/backup/client.user_info-$(date +%Y%m%d).sql

 [root@mysql ~]# chmod +x /opt/bak_client.sh

 [root@mysql ~]# crontab -e

0       0       *       *       *       /opt/bak_client.sh

[root@mysql ~]# crontab -l【每天0:00备份】

0       0       *       *       *       /opt/bak_client.sh

三、mysql数据库备份脚本

3.0实验环境:

mysql——mysql    192.168.1.138

mysql——client     192.168.1.139

3.1实验需求:对mysql——mysql的auth库和client库,实现异地备份,每天凌晨2:00进行备份,撰写一个数据恢复脚本

3.3  mysql 服务端授权,给予select和lock tables权限,以备份

[root@mysql ~]# mysql -uroot -p123123

mysql> grant select,lock tables on auth.* to 'admin'@'192.168.1.139' identified by '123123';

Query OK, 0 rows affected (0.03 sec)

mysql> grant select,lock tables on client.* to 'admin'@'192.168.1.139' identified by '123123';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

3.4 客户端安装客户端软件

[root@client ~]# rpm -qa|grep mysql

[root@client ~]# yum -y install mysql

 

3.5连接测试

[root@client ~]# mysql -uadmin -p123123 -h192.168.1.138【连接测试】

MySQL [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| client             |

| test               |

+--------------------+

4 rows in set (0.00 sec)

3.6 撰写客户端备份脚本

[root@client ~]# vim /opt/bakmysql.sh

#!/bin/bash

#mysql数据库备份脚本

#设置登录变量

MY_USER="admin"

MY_PASS="123123"

MY_HOST="192.168.1.138"

MY_CONN="-u$MY_USER -p$MY_PASS -h$MY_HOST"

#设置备份的数据库

MY_DB1="auth"

MY_DB2="client"

#定义备份路径、工具、时间、文件名

MY_USER="admin"

MY_PASS="123123"

MY_HOST="192.168.1.138"

MY_CONN="-u$MY_USER -p$MY_PASS -h$MY_HOST"

#设置备份的数据库

MY_DB1="auth"

MY_DB2="client"

#定义备份路径、工具、时间、文件名

BF_DIR="/backup"

BF_CMD="/usr/bin/mysqldump"

BF_TIME=$(date +%Y%m%d-%H%M)

NAME_1="$MY_DB1-$BF_TIME"

NAME_2="$MY_DB2-$BF_TIME"

#备份为.sql脚本,然后打包压缩(打包后删除原文件)

[ -d $BF_DIR ] || mkdir -p $BF_DIR

cd $BF_DIR

$BF_CMD $MY_CONN --databases $MY_DB1 >$NAME_1.sql

$BF_CMD $MY_CONN --databases $MY_DB1 >$NAME_2.sql

/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &>/dev/null

/bin/tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &>/dev/null

保存退出

[root@client ~]# chmod +x /opt/bakmysql.sh

[root@client ~]# /opt/bakmysql.sh

[root@client ~]# ls /backup/【出现俩个包】

auth-20190512-2221.tar.gz  client-20190512-2221.tar.gz

【 -t 显示包括在tar文件中的文件列表;-v 显示文件的归档进度;-f  当与 】

[root@client ~]# tar tvf /backup/auth-20190512-2221.tar.gz 【显示tar文件的归档时间和权限】

-rw-r--r-- root/root      2171 2019-05-12 22:22 auth-20190512-2221.sql

[root@client ~]# tar tvf /backup/client-20190512-2221.tar.gz

-rw-r--r-- root/root      2171 2019-05-12 22:22 client-20190512-2221.sql

[root@client ~]# crontab -e

0       2       *       *       *       /opt/bakmysql.sh

 

3.7 改变系统时间,执行任务计划,模拟每天的备份,为之后的恢复脚本做准备

[root@client ~]# date【查看现在的时间】

2019年 05月 12日 星期日 22:32:38 CST

[root@client ~]# date 051301592019.59【MMDDhhmmYY.SS月日小时分钟.秒】修改系统时间

2019年 05月 13日 星期一 01:59:59 CST

[root@client ~]# ls /backup/【原来的文件】

auth-20190512-2221.tar.gz  client-20190512-2221.tar.gz

[root@client ~]# ls /backup/【再次查看多了俩个文件,证明脚本运行成功了】

auth-20190512-2221.tar.gz  client-20190512-2221.tar.gz

auth-20190513-0200.sql     client-20190513-0200.sql

[root@client ~]# date 051401592019.59

2019年 05月 14日 星期二 01:59:59 CST

 

[root@client ~]# date 051501592019.59

2019年 05月 15日 星期三 01:59:59 CST

[root@client ~]# ls /backup/【又多出来4个】

auth-20190512-2221.tar.gz  auth-20190515-0200.sql       client-20190514-0200.tar.gz

auth-20190513-0200.tar.gz  client-20190512-2221.tar.gz  client-20190515-0200.sql

auth-20190514-0200.tar.gz  client-20190513-0200.tar.gz

3.8 撰写数据恢复脚本

[root@client ~]# vim /opt/restore_mysql.sh

#!/bin/bash

#恢复mysql数据库数据脚本

#设置变量

MY_USER="admin"

MY_PASS="123123"

MY_HOST="192.168.1.138"

BF_DIR="/backup"

mkdir .aaa

ls $BF_DIR |column -t > .aaa/db_list

awk -F'-''{print $2}' .aaa/db_list > .aaa/dt.txt

read -p "请指定要恢复数据库的日期(YYYYMMSS):" dt

if  [ $dt -ge 20190501 ] && [ $dt -le 20190601 ];then

            grep "$dt" .aaa/dt.txt &>/dev/null

            if [ $? -ne 0 ];then

                       echo "很抱歉,您恢复数据库的备份日期不在备份日期范围内"

            else

                       echo "搜索到的可恢复数据库如下:"

                       awk  -F '-'  /$dt/'{print NR,$1}' .aaa/db_list

                       read -p "请选择您要恢复数据库的编号:" nb

                       nm=$(awk -F'-' /$dt/'{print NR,$1}' .aaa/db_list |awk /$nb/'{print $2}')

                       echo "现在开始恢复数据库:$nm 到$dt"

                       cd $BF_DIR

                       onm=$(ls |grep "$nm-$dt")

                       mkdir .bbb

                       tar xf $onm -C .bbb

                       mysql -u$MY_USER -p$MY_PASS -h$MY_HOST $nm < .bbb/*

                       echo "$nm 已经恢复到$dt "

                                               rm -rf .bbb

                       cd - & >/dev/null

                       rm -rf .aaa

                       fi

else

            echo "很抱歉,您恢复数据库的备份日期不在备份日期范围内"

fi

[root@client ~]# chmod +x /opt/restore_mysql.sh

【如在客户端恢复数据,需要开放权限】

【mysql主机】

[root@mysql ~]# mysql -uroot -p123123

mysql> grant all on auth.* to 'admin'@'192.168.1.139';

Query OK, 0 rows affected (0.00 sec)

mysql> grant all on client.* to 'admin'@'192.168.1.139';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

3.9 恢复测试

[root@client ~]# /opt/restore_mysql.sh

mkdir: 无法创建目录".aaa": 文件已存在

请指定要恢复数据库的日期(YYYYMMSS):20190513

搜索到的可恢复数据库如下:

2 auth

6 client

请选择您要恢复数据库的编号:2

现在开始恢复数据库:auth 到20190513

auth 已经恢复到20190513

/root

[root@client ~]# /opt/restore_mysql.sh

mkdir: 无法创建目录".aaa": 文件已存在

请指定要恢复数据库的日期(YYYYMMSS):20200101

很抱歉,您恢复数据库的备份日期不在备份日期范围内

 

实验补充:

1、在恢复备份时出现没数据库,在mysql数据库里新建那个库,再进行恢复,即可成功

2、迁移数据库文件后再启动出现启动失败

[root@mysql ~]# killall -9 mysql【杀死进程 可以多杀5遍】

查看没有进程后

[root@mysql ~]# cd /usr/local/mysql/data/【删除这个路径下的这俩文件,其他文件不可动】

ib_logfile0 

ib_logfile1

重启mysql即可

3、完全备份+日志备份可对mysql进行最大化还原

4、mysql模拟数据丢失,导致mysql数据库重启失败、

是因为文件切换位置后导致文件权限跟换、切换文件权限

/usr/local/mysql/data/改为mysql  mysql

4.0是因为文件切换位置后导致文件权限跟换、切换文件权限

/usr/local/mysql/data/改为mysql  mysql

解决方法 :给予权限,执行 “chown -R mysql:mysql /var/data” “chmod -R 755 /usr/local/mysql/data”  然后重新启动mysqld!

4.1 mysql相关进程后台运行中。杀死重启

[root@client data]# ps -ef |grep mysqld

root       1255      1  0 5月12 ?       00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid

mysql      1872   1255  0 5月12 ?       00:01:02 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql

4.5删除这个文件,

 [root@client data]# ls

client.err                 mysql             mysql-bin.000004  performance_schema

ibdata1                    mysql-bin.000001  mysql-bin.000005  test

localhost.localdomain.err  mysql-bin.000002  mysql-bin.000006

localhost.localdomain.pid  mysql-bin.000003  mysql-bin.index

5、出现mysql启动失败报错 /tmp/mysql.sock是初始化命令不对,重新输入过一遍就好

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: