|
如果你需要备份服务器上的DNF数据库,或者,需要迁移数据库到其它服务器,那么以下的教程可以很好的帮助到你。(除了非台服单机玩家,还有从事DNF开服的玩家也很需要),简单的设定可以实现每天Mysql数据库自动备份,并且删除15天以上的数据库,是不是有点迫不及待想要操作一下了,那就看接下来的教程吧。
一、如何自动备份数据库
1.首先检查服务器是否安装“crontab”已经安装过的可以忽略此步骤
- yum -y install vixie-cron
复制代码
2.创建Mysql数据备份文件存放目录
备份文件夹目录及文件夹名称都可以自己修改,但修改后需同步修改备份脚本路径。(注意:备份目录需要有ROOT权限)3.创建数据库自动备份文件
- touch /usr/sbin/bakmysql.sh
复制代码
4.编辑shell脚本
加入以下内容
- #关闭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
5、重新启动crond
- /etc/rc.d/init.d/crond restart
复制代码
========================================================
二、创建备份任务并自动删除15天以前备份的语句:
1.创建保存mysql数据库备份文件的目录mysqlbak
2.编辑shell脚本
加入如下内容:
- #关闭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
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[password]:密码
--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、创建备份文件夹
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_DIR mysql备份地址
$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 )
3、在此目录下执行脚本,验证脚本是否正确
此时我也遇到了前面两位笔者提到的错误,提示如下:
- /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、编辑定时任务列表
如下图所示:
2、按【i】键进入编辑权限,插入如下脚本,按【Esc】后输入:wq即可保存退出编辑了:
- #每天早上 5:00am 执行
- 00 05 * * * /bin/sh /usr/local/apache/htdocs/timepusher/sqlBak/bakmysql.sh
复制代码
定时的一些说明:
crontab配置文件格式如下:
分 时 日 月 周 命令
3、查看设置的定时任务是否成功:
如下图所示:
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丶冷漠
|
|