返回列表 发帖

Linux下MySQL的备份和还原

笺注:这是在 CentOS6.9编译安装Zabbix4.4.5 的基础上进行的。


先创建存放备份文件的目录:
[root@Zabbix_server_01 ~]# mkdir -p /home/backup
[root@Zabbix_server_01 ~]# chmod -R 777 /home/backup


确认备份命令mysqldump已经安装:
[root@Zabbix_server_01 ~]# which mysqldump
/usr/bin/mysqldump


### 在服务器本地备份单个库 ###
[root@Zabbix_server_01 ~]# mysqldump -u"root" -p"888" -h"localhost" zabbix > /home/backup/zabbix_bak.sql
[root@Zabbix_server_01 ~]#

注释:
备份库zabbix
使用数据库管理员root@localhost,密码为888
在服务器本地登录时, -h"localhost" 是可以省略的


备份出来的文件:
[root@Zabbix_server_01 ~]# du -sh /home/backup/zabbix_bak.sql
3.5M    /home/backup/zabbix_bak.sql
[root@Zabbix_server_01 ~]#





### 在服务器本地还原单个库 ###

使用数据库管理员root@localhost登录MySQL:
mysql -u"root" -p"888" -h"localhost"
图片1.png
注释:在服务器本地登录时, -h"localhost" 是可以省略的。


删除库zabbix:(还原前,最好删除旧库)
mysql> drop database zabbix;
Query OK, 149 rows affected (0.59 sec)


重新创建库zabbix,并指定其字符集:
mysql> create database zabbix character set utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)


切换到库zabbix:
mysql> use zabbix;
Database changed


以防中文出现乱码,最好先设置一下编码规则:
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)


还原单个库(zabbix):
mysql> source /home/backup/zabbix_bak.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>

备注:实验中,库zabbix的还原是成功的。





######

在服务器本地自动创建库、表的Shell脚本:
[root@Zabbix_server_01 ~]# cat create-database.sh
#!/bin/bash   
mysql_user="root"  
mysql_password="888"  
mysql_database="data1"  
  
mysql -u$mysql_user -p$mysql_password << EOF > /dev/null  
  
Create database ${mysql_database} character set utf8 collate utf8_bin;  
Use ${mysql_database};

create table table1(
   id int not null auto_increment,
   number varchar(50) not null,
   name varchar(50),
   address varchar(50),
   primary key (id)
);

create table table2(
   id int not null auto_increment,
   number varchar(50) not null,
   name varchar(50),
   address varchar(50),
   primary key (id)
);

create table table3(
   id int not null auto_increment,
   number varchar(50) not null,
   name varchar(50),
   address varchar(50),
   primary key (id)
);

EOF


运行脚本:
[root@Zabbix_server_01 ~]# bash create-database.sh
[root@Zabbix_server_01 ~]#


运行脚本后的结果:
[root@Zabbix_server_01 ~]# mysql -u"root" -p"888" -h"localhost" -e"show create database data1;"
+----------+---------------------------------------------------------------------------------+
| Database | Create Database                                                                 |
+----------+---------------------------------------------------------------------------------+
| data1    | CREATE DATABASE `data1` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+---------------------------------------------------------------------------------+
[root@Zabbix_server_01 ~]#

注释:创建了一个库data1,其字符集为 utf8_bin



[root@Zabbix_server_01 ~]# mysql -u"root" -p"888" -e"use data1;show tables;"
+-----------------+
| Tables_in_data1 |
+-----------------+
| table1          |
| table2          |
| table3          |
+-----------------+
[root@Zabbix_server_01 ~]#

注释:在库data1中创建了表table1、table2、table3



######

往库data1里的表table1中添加一条记录:
Use data1;
insert into table1 (number,name,address) values ('A001','zhuohua','佛山');

SELECT * FROM table1;
图片2.png



######

往库data1里的表table2中添加一条记录:
Use data1;
insert into table2 (number,name,address) values ('B001','Python','广州');

SELECT * FROM table2;
图片3.png



######

往库data1里的表table3中添加一条记录:
Use data1;
insert into table3 (number,name,address) values ('C001','Mary','深圳');

SELECT * FROM table3;
图片4.png





### 在服务器本地一次性备份多个库 ###
[root@Zabbix_server_01 ~]# mysqldump -u"root" -p"888" --databases zabbix data1 > /home/backup/aa.sql
[root@Zabbix_server_01 ~]#

注释:一次性备份多个库要加上参数“--databases”;多个库(zabbix、data1)之间使用空格隔开。


备份出来的文件:
[root@Zabbix_server_01 ~]# du -sh /home/backup/aa.sql
3.7M    /home/backup/aa.sql
[root@Zabbix_server_01 ~]#





######

备份成功后,删除库zabbix:
mysql> drop database zabbix;
Query OK, 149 rows affected (0.71 sec)

mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| data1              |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

mysql>



######

备份成功后,删除库data1里的表table1:
Use data1;
Drop table table1;

mysql> SELECT * FROM data1.table1;
ERROR 1146 (42S02): Table 'data1.table1' doesn't exist
mysql>



######

备份成功后,继续往库data1里的表table2中添加一条记录:
Use data1;
insert into table2 (number,name,address) values ('B002','Happy','广州');

SELECT * FROM data1.table2;
图片5.png



######

备份成功后,继续往库data1里的表table3中添加一条记录:
Use data1;
insert into table3 (number,name,address) values ('C002','李大杰','广州');

SELECT * FROM table3;
图片6.png


再更改库data1的表table3的表名为table3_bak
Use data1;
alter table table3 rename to table3_bak;

show tables;
图片7.png





### 在服务器本地一次性还原多个库 ###
[root@Zabbix_server_01 ~]# mysql -u"root" -p"888" < /home/backup/aa.sql
[root@Zabbix_server_01 ~]#

注释:
只还原了库zabbix、data1,不影响不相关的库。
这种方法不用先创建库。



######
还原成功后,查看所有的库:
图片8.png
笺注:库zabbix的所有表都还原了。


被还原的库的字符集不会改变:
mysql> show create database zabbix;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| zabbix   | CREATE DATABASE `zabbix` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

mysql> show create database data1;
+----------+---------------------------------------------------------------------------------+
| Database | Create Database                                                                 |
+----------+---------------------------------------------------------------------------------+
| data1    | CREATE DATABASE `data1` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>



######
还原成功后,查看库data1里的表:
图片9.png


######
还原成功后,查看库data1的表table1的表数据:
图片10.png


######
还原成功后,查看库data1的表table2的表数据:
图片11.png


######
还原成功后,查看库data1的表table3的表数据:
图片12.png


######
还原成功后,查看库data1的表table3_bak的表数据:
图片13.png

结论:
还原某个库时,假如库里的某个表不存在,会还原备份文件里的表;
假如表名重复,会被备份文件里的表直接替换;假如表名不重复,则不处理。



######
还原成功后,删除库data1的表table3,再更改库data1的表table3_bak的表名为table3:
mysql> drop table data1.table3;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table data1.table3_bak rename to data1.table3;
Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> use data1;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_data1 |
+-----------------+
| table1          |
| table2          |
| table3          |
+-----------------+
3 rows in set (0.00 sec)

mysql>

注释:这样就可以实现只还原某个库里的一些表了。





### 使用脚本在服务器本地备份数据库 ### (只备份库zabbix

[root@Zabbix_server_01 ~]# cat backup_local_1.sh
#!/bin/bash
mysql_user="root"
mysql_password="888"
conn="-u$mysql_user -p$mysql_password"
mysql_database="zabbix"
dir="/home/backup"  #备份文件存放的目录要先创建好,并设置好权限
cmd="/usr/bin/mysqldump"  #备份命令的路径使用which mysqldump查询
time=`date +%Y%m%d`  #时间格式:年月日
mysql_name="$mysql_database-$time"
cd $dir/
$cmd $conn $mysql_database > $mysql_name.sql


设置脚本权限:
[root@Zabbix_server_01 ~]# chmod a+x backup_local_1.sh
[root@Zabbix_server_01 ~]#

运行脚本:
[root@Zabbix_server_01 ~]# bash backup_local_1.sh
[root@Zabbix_server_01 ~]#

运行脚本后的结果:(备份成功)
[root@Zabbix_server_01 ~]# du -ah /home/backup/
4.0M    /home/backup/zabbix-20200208.sql
3.5M    /home/backup/zabbix_bak.sql
3.7M    /home/backup/aa.sql
12M     /home/backup/
[root@Zabbix_server_01 ~]#





### 使用脚本在服务器本地备份数据库 ### (备份库zabbix、data1)

[root@Zabbix_server_01 ~]# cat backup_local_2.sh
#!/bin/bash
mysql_user="root"
mysql_password="888"
conn="-u$mysql_user -p$mysql_password"
mysql_database="zabbix data1"
dir="/home/backup"
cmd="/usr/bin/mysqldump"
time=`date +%Y%m%d_%H%M%S` #时间格式:年月日_时分秒
mysql_name="bb-$time" #备份文件的名称
cd $dir/
$cmd $conn --databases $mysql_database > $mysql_name.sql


设置脚本权限:
[root@Zabbix_server_01 ~]# chmod a+x backup_local_2.sh
[root@Zabbix_server_01 ~]#


运行脚本:
[root@Zabbix_server_01 ~]# bash backup_local_2.sh
[root@Zabbix_server_01 ~]#


运行脚本后的结果:(备份成功)
[root@Zabbix_server_01 ~]# du -ah /home/backup/
4.0M    /home/backup/zabbix-20200208.sql
3.5M    /home/backup/zabbix_bak.sql
3.7M    /home/backup/aa.sql
4.0M    /home/backup/bb-20200208_135445.sql
16M     /home/backup/
[root@Zabbix_server_01 ~]#













### 使用脚本在远程服务器备份数据库 ###

被备份的服务器(192.168.168.130)要创建一个远程数据库用户并授权:

授权远程数据库用户zhuohua@'192.168.168.154'(密码886),仅仅在使用IP地址192.168.168.154时可以进行访问,对所有的库有完全控制的权限:
[root@Zabbix_server_01 ~]# mysql -u"root" -p"888" -e"grant all on *.* to zhuohua@'192.168.168.154' identified by '886';"
[root@Zabbix_server_01 ~]#


查看远程数据库用户zhuohua@'192.168.168.154'的权限:
[root@Zabbix_server_01 ~]# mysql -u"root" -p"888" -e"show grants for zhuohua@'192.168.168.154';"
+-------------------------------------------------------------------------------------------------------------------------------+
| Grants for zhuohua@192.168.168.154                                                                                            |
+-------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zhuohua'@'192.168.168.154' IDENTIFIED BY PASSWORD '*F961C54AFEB4D281CE53D7CB8E7822890D86FFFC' |
+-------------------------------------------------------------------------------------------------------------------------------+
[root@Zabbix_server_01 ~]#


编辑防火墙规则:(打开TCP 3306端口)
[root@Zabbix_server_01 ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
[root@Zabbix_server_01 ~]# iptables-save > /etc/sysconfig/iptables



############
Linux客户端远程登录MySQL服务器:
[root@centos8 ~]# mysql -u"zhuohua" -p"886" -h"192.168.168.130"
图片14.png
注释:
MySQL服务器的IP地址 192.168.168.130
数据库用户名 zhuohua
密码 886
端口 3306

笺注:
Linux客户端需要安装MySQL或MariaDB
Linux客户端的IP地址为 192.168.168.154
使用数据库用户zhuohua@'192.168.168.154'



在Linux客户端查看数据库里有哪些库:
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| data1              |
| mysql              |
| performance_schema |
| zabbix             |
+--------------------+
5 rows in set (0.001 sec)

MySQL [(none)]>

注释:远程数据库用户 zhuohua@'192.168.168.154' 可以登录MySQL,对所有的库有完全控制的权限。





在Linux客户端确认备份命令mysqldump已经安装:
[root@centos8 ~]# which mysqldump
/usr/bin/mysqldump


在Linux客户端先创建存放备份文件的目录:
[root@centos8 ~]# mkdir -p /backup
[root@centos8 ~]# chmod -R 777 /backup


### 在Linux客户端远程备份单个库(zabbix) ###
[root@centos8 ~]# mysqldump -u"zhuohua" -p"886" -h"192.168.168.130" zabbix > /backup/zabbix_bak.sql
[root@centos8 ~]#


备份出来的文件:
[root@centos8 ~]# du -sh /backup/zabbix_bak.sql
4.2M    /backup/zabbix_bak.sql
[root@centos8 ~]#





### Linux客户端远程备份数据库的脚本 ### (只备份库zabbix

[root@centos8 ~]# cat backup_remote_1.sh
#!/bin/bash
mysql_user="zhuohua"
mysql_password="886"
mysql_host="192.168.168.130" #被备份的服务器的IP地址

conn="-u$mysql_user -p$mysql_password -h$mysql_host"

mysql_database="zabbix"
dir="/backup"
cmd="/usr/bin/mysqldump" #使用Linux客户端的备份命令mysqldump
time=`date +%Y%m%d`
mysql_name="$mysql_database-$time"
cd $dir/
$cmd $conn $mysql_database > $mysql_name.sql


设置脚本权限:
[root@centos8 ~]# chmod a+x backup_remote_1.sh
[root@centos8 ~]#

运行脚本:
[root@centos8 ~]# bash backup_remote_1.sh
[root@centos8 ~]#


备份出来的文件:
[root@centos8 ~]# du -ah /backup/
4.2M    /backup/zabbix_bak.sql
3.6M    /backup/zabbix-20210423.sql
7.7M    /backup/
[root@centos8 ~]#





### Linux客户端远程备份数据库的脚本 ### (备份库zabbix、data1)

[root@centos8 ~]# cat backup_remote_2.sh
#!/bin/bash
mysql_user="zhuohua"
mysql_password="886"
mysql_host="192.168.168.130" #被备份的服务器的IP地址

conn="-u$mysql_user -p$mysql_password -h$mysql_host"

mysql_database="zabbix data1"
dir="/backup"
cmd="/usr/bin/mysqldump"
time=`date +%Y%m%d_%H%M%S`
mysql_name="bb-$time"
cd $dir/
$cmd $conn --databases $mysql_database > $mysql_name.sql


设置脚本权限:
[root@centos8 ~]# chmod a+x backup_remote_2.sh
[root@centos8 ~]#


运行脚本:
[root@centos8 ~]# bash backup_remote_2.sh
[root@centos8 ~]#


备份出来的文件:
[root@centos8 ~]# du -ah /backup/
4.2M    /backup/zabbix_bak.sql
3.6M    /backup/zabbix-20220423.sql
3.6M    /backup/bb-20210423_153142.sql
12M     /backup/
[root@centos8 ~]#





相关文章:
MySQL的字符集
MySQL5.6使用mysql_config_editor

使用SQLyog远程管理MySQL
LNMP一键安装包(lamp_Apache2.4用户验证+phpMyAdmin)

本地备份站点目录和数据库+crontab计划任务
远程备份站点目录和数据库+at一次性计划任务
CentOS6使用Python3脚本备份站点(Zabbix)+crontab计划任务

Windows下MySQL的备份和还原

返回列表