dnf台服吧 发表于 2019-4-26 04:03:44

关于DNF台服数据备份自动备份全部数据库教程(脚本+命令)

如果你需要备份服务器上的DNF数据库,或者,需要迁移数据库到其它服务器,那么以下的教程可以很好的帮助到你。(除了非台服单机玩家,还有从事DNF开服的玩家也很需要),简单的设定可以实现每天Mysql数据库自动备份,并且删除15天以上的数据库,是不是有点迫不及待想要操作一下了,那就看接下来的教程吧。

一、如何自动备份数据库
1.首先检查服务器是否安装“crontab”已经安装过的可以忽略此步骤
yum -y install vixie-cron
2.创建Mysql数据备份文件存放目录
mkdir /home/mysqlbak备份文件夹目录及文件夹名称都可以自己修改,但修改后需同步修改备份脚本路径。(注意:备份目录需要有ROOT权限)3.创建数据库自动备份文件
touch /usr/sbin/bakmysql.sh
4.编辑shell脚本
vi /usr/sbin/bakmysql.sh
加入以下内容
#关闭mysql数据库服务
/opt/lampp/lampp stopmysql
#创建以当前日期为名称的目录
cd /home/mysqlbak
time=$(date '+%Y%m%d')
mkdir $time
cp /opt/lampp/var/mysql/TD_OA/*.* /home/mysqlbak/$time
#备份完成后开启mysql数据库服务
/opt/lampp/lampp startmysql
#删除9天以前的备份
find /home/mysqlbak -type d -mtime +9 -exec rm -rf {} \;
5.修改脚本为可执行文件
chmod +x /usr/sbin/bakmysql.sh
6.修改/etc/crontab
vi /etc/crontab
5、重新启动crond
/etc/rc.d/init.d/crond restart
========================================================
二、创建备份任务并自动删除15天以前备份的语句:

1.创建保存mysql数据库备份文件的目录mysqlbak
mkdir /home/mysqlbak
2.编辑shell脚本
vi /usr/sbin/bakmysql.sh
加入如下内容:
#关闭mysql数据库服务
/opt/lampp/lampp stopmysql
#创建以当前日期为名称的目录
cd /home/mysqlbak
time=$(date '+%Y%m%d')
mkdir $time
cp /opt/lampp/var/mysql/TD_OA/*.* /home/mysqlbak/$time
#备份完成后开启mysql数据库服务
/opt/lampp/lampp startmysql
#删除9天以前的备份
find /home/mysqlbak -type d -mtime +9 -exec rm -rf {} \;

3、修改文件属性,使其可执行
chmod +x /usr/sbin/bakmysql.sh
4、修改/etc/crontab
vi /etc/crontab
5、重新启动crond
/etc/rc.d/init.d/crond restart
centos 下mysqldump备份多个数据库命令

备份命令:
mysqldump -u root -p --databases 数据库1 数据库2 > xxx.sql
还原命令:
系统命令行: MySQL -uroot -p123456 <f:\all.sql

参考命令行:
--all-databases, -A: 备份所有数据库
--databases, -B: 用于备份多个数据库,如果没有该选项,mysqldump把第一个名字参数作为数据库名,后面的作为表名。使用该选项,mysqldum把每个名字都当作为数据库名。

--force, -f:即使发现sql错误,仍然继续备份
--host=host_name, -h host_name:备份主机名,默认为localhost
--no-data, -d:只导出表结构
--password[=password], -p:密码
--port=port_num, -P port_num:制定TCP/IP连接时的端口号
--quick, -q:快速导出
--tables:覆盖 --databases or -B选项,后面所跟参数被视作表名
--user=user_name, -u user_name:用户名
--xml, -X:导出为xml文件

1.备份全部数据库的数据和结构

mysqldump -uroot -p123456 -A >F:\all.sql

2.备份全部数据库的结构(加 -d 参数)

mysqldump -uroot -p123456 -A-d>F:\all_struct.sql

3.备份全部数据库的数据(加 -t 参数)

mysqldump -uroot -p123456 -A-t>F:\all_data.sql

4.备份单个数据库的数据和结构(,数据库名mydb)

mysqldump -uroot-p123456 mydb>F:\mydb.sql

5.备份单个数据库的结构

mysqldump -uroot -p123456 mydb-d>F:\mydb.sql

6.备份单个数据库的数据

mysqldump -uroot -p123456 mydb-t>F:\mydb.sql

7.备份多个表的数据和结构(数据,结构的单独备份方法与上同)

mysqldump -uroot -p123456 mydb t1 t2>f:\multables.sql

8.一次备份多个数据库

mysqldump -uroot -p123456 --databases db1 db2>f:\muldbs.sql

还原部分分(1)mysql命令行source方法 和 (2)系统命令行方法

1.还原全部数据库:

(1) mysql命令行:mysql>source f:\all.sql

(2) 系统命令行: mysql -uroot -p123456 <f:\all.sql

2.还原单个数据库(需指定数据库)

(1) mysql>use mydb

mysql>source f:\mydb.sql

(2) mysql -uroot -p123456 mydb <f:\mydb.sql

3.还原单个数据库的多个表(需指定数据库)

(1) mysql>use mydb

mysql>source f:\multables.sql

(2) mysql -uroot -p123456 mydb<f:\multables.sql

4.还原多个数据库,(一个备份文件里有多个数据库的备份,此时不需要指定数据库)

(1) mysql命令行:mysql>source f:\muldbs.sql

(2) 系统命令行: mysql -uroot -p123456<f:\muldbs.sql

让linux每天定时备份MySQL数据库并删除五天前的备份文件让linux每天定时备份MySQL数据库并删除五天前的备份文件

1、创建备份文件夹
#cd /bak#mkdir mysqldata
2、编写运行脚本#vi /usr/sbin/bakmysql.sh注:如使用nano编辑此代码需在每行尾添加'&&'或';'连接符,否则生成的文件名末尾字符为乱码
代码:
#!/bin/bash# Name:bakmysql.sh

保存退出说明:
代码中time=` date +%Y%m%d%H `也可以写为time="$(date +"%Y%m%d$H")"其中`符号是TAB键上面的符号,不是ENTER左边的'符号,还有date后要有一个空格。mysql_bin_dir:mysql的bin路径;
dataname:数据库名;
user:数据库用户名;
password:用户密码;
name:自定义备份文件前缀标识。
-type f 表示查找普通类型的文件,f表示普通文件。
-mtime +5 按照文件的更改时间来查找文件,+5表示文件更改时间距现在5天以前;
如果是 -mmin +5 表示文件更改时间距现在5分钟以前。
-exec rm {} \; 表示执行一段shell命令,exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
/dev/null 2>&1 把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面;
其中的& 表示让该命令在后台执行。
3、为脚本添加执行权限# chmod +x /usr/sbin/bakmysql.sh
4、修改/etc/crontab(在centOS5中测试可行)或crontab -e检查有没安装crond,如果没有,先安装
yum -y install vixie-cron
#vi /etc/crontab
在最后一行中加入:
00 3 * * * root /usr/sbin/bakmysql.sh
表示每天3点00分执行备份
注:crontab配置文件格式如下:分 时 日 月 周  命令
Redhat方法:
Redhat的crontab采用按时间调用4个目录(/etc/cron.hourly:每小时;/etc/cron.daily:每天;/etc/cron.weekly:每周;/etc/cron.monthly:每月)中脚本出来运行的方式。Redhat中只需要将刚才编辑的脚本复制到相应的目录即可。
5、重启crontab
# /etc/rc.d/init.d/crond restart 或者service crond restart完成。
6、恢复数据备份文件:
非压缩备份文件恢复:   
#mysql -u root -p dataname < name2008010103.sql
从压缩文件直接恢复:
#gzip < name2008010103.sql.gz | mysql -u root -p dataname或:# zcat name2008010103.sql.gz | mysql -u root -p其它解决方法

一、mysql提供了一个mysqldump的工具可以方便的导出导入数据库信息;

二、使用命令行shell测试执行mysqldump,理解必备的参数,查看生成的sql备份文件是否符合需求;

$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_ZFBM$DB_NAME$DB_TABLE > $BCK_DIR/db_$DATE.sql
脚本说明:

$BIN_DIRmysql备份地址

$DB_USER数据库用户名

$DB_PASS   数据库密码

$DB_HOST   数据库地址(IP或者是localhost之类的)

$DB_ZFBM   字符集编码设置(这个很关键,解决导出文件中中文乱码)

$DB_NAME数据库名称

$DB_TABLE要备份的表名(如果只对单一表进行备份,可以加此字段,全库备份的可以省略掉)

$BCK_DIR/db_$DATE.sql   备份的地址和备份文件名称

三、下面是我亲自试验过得,在两位前辈的基础上加以修改过的脚本

#!/bin/bash
# Name:bakmysql.sh
# This is a ShellScript For Auto DB Backup and Delete old Backup
#

# Database info
DB_USER="root"                                                   #mysql login name
DB_PASS="123456"                                           #password
DB_HOST="localhost"                                 #db_address
DB_NAME="bosh_education"               #db_name
DB_ZFBM="--default-character-set=utf8" #character
DB_TABLE="exam_quest_bank"             #table name

# Others vars
BIN_DIR="/usr/bin"            #the mysql bin path
BCK_DIR="/usr/mysqlbeifen"    #the backup file directory
DATE=`date +%F`

#--skip-lock-tables      zg backup
#$BIN_DIR/mysqldump -u $DB_USER -p$DB_PASS$DB_ZFBM$DB_NAME$DB_TABLE | gzip > $BCK_DIR/db_$DATE.sql.gz

#data beifen
#$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST$DB_ZFBM$DB_NAME | gzip > $BCK_DIR/db_$DATE.sql.gz

#sql back
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_ZFBM$DB_NAME$DB_TABLE > $BCK_DIR/db_$DATE.sql

#
find $BCK_DIR -name "db_*.sql" -type f -mtime +3 -exec rm {} \; > /dev/null 2>&1
#find $BCK_DIR -name "db_*.gz" -type f -mtime +3 -exec rm {} \; > /dev/null 2>&1

如下图所示:



四、测试脚本是否可用

1、进入到该脚本文件目录

cd /usr/local/apache/htdocs/timepusher/sqlBak

2、给刚才的脚本附加权限(否则会报错Permission denied )

chmod +x bakmysql.sh

3、在此目录下执行脚本,验证脚本是否正确

./bakmysql.sh

此时我也遇到了前面两位笔者提到的错误,提示如下:

/bin/sh^M: bad interpreter: No such file or directory

这是因为在windows编写上传的文件导致,是不同系统编码格式引起的:在 windows系统中编辑的 .sh文件可能有不可见字符,所以在 Linux系统下执行会报以上异常信息。可以在Windows上使用Notepad++转换成Unix格式(菜单中选择:编辑>档案格式转换>转换成UNIX),按照此不方法操作后即可正常执行了。操作如下:



4、修改后上传继续执行 ./bakmysql.sh ,没有报错。再查看导出的sql文件。如下图所示:



到此就完成了所有的脚本编写和测试。下面再详细说一下导出时候的脚本语言:

$BIN_DIR/mysqldump -u $DB_USER -p$DB_PASS$DB_ZFBM$DB_NAME$DB_TABLE | gzip > $BCK_DIR/db_$DATE.sql.gz

由于导出整个数据的文件较大,所以建议使用压缩文件的形式,上述是导出压缩文件的脚本,加上表名($DB_TABLE)可以指定表导出,不加表名的导出整个数据库表,根据自己的情况实际使用。直接导出sql文件的也是这个道理,就不细说了。

由于每天定时备份数据库,会导致很占内存,所以此处也给出了定时删除备份数据库的脚本,如下所示:

find $BCK_DIR -name "db_*.sql" -type f -mtime +3 -exec rm {} \; > /dev/null 2>&1

解释一下:

-type f               表示查找普通类型的文件,f表示普通文件。

-mtime +3         按照文件的更改时间来查找文件,+3表示文件更改时间距现在3天以前;如果是 -mmin +5 表示文件更改时间距现在5分钟以前。

-exec rm {} \;       表示执行一段shell命令,exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个,最后是一个分号。

/dev/null 2>&1      把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面;其中的& 表示让该命令在后台执行。

五、定时脚本的编写

1、编辑定时任务列表

crontab -e
如下图所示:


2、按【i】键进入编辑权限,插入如下脚本,按【Esc】后输入:wq即可保存退出编辑了:

#每天早上 5:00am 执行
00 05 *   * * /bin/sh /usr/local/apache/htdocs/timepusher/sqlBak/bakmysql.sh

定时的一些说明:

crontab配置文件格式如下:
分 时 日 月 周  命令

3、查看设置的定时任务是否成功:

crontab -l
如下图所示:


4、重启crontab(分别有给出了别的操作命令)

#重启
/bin/systemctl restart crond.service

#开启
/bin/systemctl start crond.service

#停止
/bin/systemctl stop crond.service

#重载
/bin/systemctl reload crond.service

#状态
/bin/systemctl status crond.service

六、第二天记得检查是否备份成功(也可以改时间校验,自己决定)
如果生成的文件和解压出来查看没有问题,那么这个自动定时备份数据库的脚本就算是完成了。

像前面了两位笔者致敬,我是站在巨人的肩膀上完成的任务,这是我第一次搞这个,所以参考的比较多,像第一位笔者出现的最后一个问题,我是没遇到,可以先记下来,方便以后出问题的时候查看:

问题描述为:如果该数据库的用户没有分配 锁表 的权限,则备份会报错 when using LOCK TABLES 。那是因为mysqldump命令默认在导出时是要锁定表的,所以解决方式有两个。一个是给该用户开放 锁表 的权限;另一个是在命令中加上--skip-lock-tables 这个参数。即是:

$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME --skip-lock-tables| gzip > $BCK_DIR/db_$DATE.sql.gz

留此贴以方便之后自己查看!!

linux下备份的sql文件在window下打开是乱码的,我们只需要在导入时候加上编码导入即可!怎么出去的怎么进来:

#这里的文件为你自己对应的文件(进入到对应的脚本路径下)
mysql -uroot -p --default-character-set=utf8 dbname < bak.sql


---------------------
作者:Demon丶冷漠



alade2019 发表于 2019-4-26 11:22:46

很赞 学习啦
页: [1]
查看完整版本: 关于DNF台服数据备份自动备份全部数据库教程(脚本+命令)