【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 用户名 -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 【恢复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【恢复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 【恢复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是初始化命令不对,重新输入过一遍就好