为服务器添加定时脚本+备份数据库

首先crontab -l

查看已有的时程表,能够展示当前的定时任务有哪些

 

编写脚本:

#!/bin/bash

HOST:127.0.0.1

User=root

PW=mima

DATETIME=$(date +%Y_%m_%d_%H%M%S)

echo "执行日期:" + ${DATETIME}

echo "开始执行清理8小时前binlog"
mysql -u$User -p$PW <<EOF

PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 8 HOUR);//清除8小时前的bin日志
EOF
echo "执行清理8小时前binlog完成~"

 

 

 

 

 

 

Binlog是什么

  binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记录

   默认情况下,binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看。

 binlog作用:主要作用是用于数据库的主从复制及数据的增量恢复。

  当有数据写入到数据库时,还会同时把更新的SQL语句写入到对应的binlog文件里,这个文件就是上文说的binlog文件。使用mysqldump备份时,只是对一段时间的数据进行全备,但是如果备份后突然发现数据库服务器故障,这个时候就要用到binlog的日志了。

 

备份与还原数据库命令 原文:https://www.cnblogs.com/yanghongtao/p/10897282.html

1.格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql

myslqdump -h 127.0.0.1 -p 22 -u root -p password --database  eclp_master>/data/backup/eclp_master.sql

2、备份压缩

导出的数据有可能比较大,不好备份到远程,这时候就需要进行压缩

格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 | gzip > 文件名.sql.gz

例如: mysqldump -h192.168.1.100 -p 3306 -uroot -ppassword --database cmdb | gzip > /data/backup/cmdb.sql.gz

 

3、备份同个库多个表

格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 表1 表2 .... > 文件名.sql

例如 mysqldump -h192.168.1.100 -p3306 -uroot -ppassword cmdb t1 t2 > /data/backup/cmdb_t1_t2.sql

 

4、同时备份多个库

格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --databases 数据库名1 数据库名2 数据库名3 > 文件名.sql

例如:mysqldump -h192.168.1.100 -uroot -ppassword --databases cmdb bbs blog > /data/backup/mutil_db.sql

 

5、备份实例上所有的数据库

格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --all-databases > 文件名.sql

例如:mysqldump -h192.168.1.100 -p3306 -uroot -ppassword --all-databases > /data/backup/all_db.sql

 

 

6、备份数据出带删除数据库或者表的sql备份

格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --add-drop-table --add-drop-database 数据库名 > 文件名.sql

例如:mysqldump -uroot -ppassword --add-drop-table --add-drop-database cmdb > /data/backup/all_db.sql

 

7、备份数据库结构,不备份数据

格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --no-data 数据库名1 数据库名2 数据库名3 > 文件名.sql

例如:mysqldump --no-data –databases db1 db2 cmdb > /data/backup/structure.sql

 

-B参数

执行mysqldump的时候加上了-B参数,那么恢复数据的时候,就不需要指定是恢复那个库里面的数据了,也不需要提前到数据库中创建一个crm2库了,因为-B参数导出的文件中自带创建数据库和连接数据库的功能:(使用-B参数备份出来的内容自带create database 库名和use 库名的功能)

备份 :mysqldump -uroot -p -B crm2> f:\数据库备份练习\crm2.sql
恢复:在cmd窗口下执行:mysql -uroot -p < f:\数据库备份练习\crm2.sql

多个库的备份:

mysqldump -uroot -p -B crm1 crm2  mysql> f:\数据库备份练习\crm2mysql.sql

就是多个库名用空格分开,这样备份出来的sql文件还是一个,也就是这两个库都备份到一个文件里面了。一般作备份的时候的文件名字都是库名.sql,多个库一般就是库名_库名_库名.sql。

多个库如果需要备份到不同的文件中需要通过写脚本完成

 

备份表:
  上面我们说的是如何备份库,现在我们来看看如果备份其中的某个表:
  语法:mysqldump -u 用户名 -p 库名 表名> (路径)备份的文件名
     mysqldump -uroot -p crm2 student> f:\数据库备份练习\crm2_table_student.sql
  单纯进行表备份的时候,就不用写-B参数了,因为库crm2后面就是student表了,也就是说你的crm2库还在呢
备份多个表:
  语法:mysqldump -u 用户名 -p 库名 表名1 表名2> (路径)备份的文件名

 

mysqldump的关键参数说明:

1.-B指定多个库,增加建库语句和use 语句
2.--compact 去掉注释,适合调试输出,生产上不用
3.-A或者--all-databases
例如:C:\WINDOWS\system32>mysqldump -uroot -p -B -A> f:\数据库备份练习\all.sql
4.-F刷新binlog日志(binlog具体是什么,后面咱们再解释)
5.--master-data 增加binlog日志文件名及对应的为支点。
6.-x,--lock-all-tables 将所有的表锁住,一般mysql引擎都是锁表,全部都不能使用了,所有不太友好
7.--add-locks这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作(mysql默认是加上的)
8.-l,--lock-tables Lock all tables for read
9.-d 只备份表结构
10.-t 只备份数据
11. --single-transaction 开启事务,适合innodb事务数据库备份
InnoDB表在备份时,通常启用选项--single-transaction来保证备份的一致性,实际上他的工作原理时设定本次会话的隔离界别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其他会话已经提交了数据。

 

还原 数据库

连接到数据库中,并创建crm2这个库   要还原的库的名称
  mysql -u root -p666
  mysql> create database crm2;
退出mysql或者重新启动一个cmd窗口,然后执行
  mysql -uroot -p 库名 < mysqldump出来的那个sql文件的路径
例如:mysql -uroot -p crm2< f:\数据库备份练习\crm2.sql

这样就恢复好了,我们连接上数据库并查看里面的内容:
  mysql -u root -p666
  use crm2;
  mysql> show tables;

 

实例操作:

#示例: #单库备份 mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

#多库备份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

#备份所有库 mysqldump -uroot -p123 --all-databases > all.sql

恢复备份:

#方法一: [root@localhost backup]# mysql -uroot -p123 < /backup/all.sql

#方法二: mysql> use db1; mysql> SET SQL_LOG_BIN=0; mysql> source /root/db1.sql

 

#数据库备份/恢复实验一:

数据库损坏 备份:

1. # mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql

2. # mysql -uroot -p123 -e 'flush logs' //截断并产生新的binlog

3. 插入数据 //模拟服务器正常运行

4. mysql> set sql_log_bin=0; //模拟服务器损坏 mysql> drop database db;

 

恢复:

1. # mysqlbinlog 最后一个binlog > /backup/last_bin.log

2. mysql> set sql_log_bin=0;

mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份

mysql> source /backup/last_bin.log //恢复最后个binlog文件

#数据库备份/恢复实验二:如果有误删除

备份:

1. mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql

2. mysql -uroot -p123 -e 'flush logs' //截断并产生新的binlog

3. 插入数据 //模拟服务器正常运行

4. drop table db1.t1 //模拟误删除

5. 插入数据 //模拟服务器正常运行

 

恢复: 1. # mysqlbinlog 最后一个binlog --stop-position=260 > /tmp/1.sql

# mysqlbinlog 最后一个binlog --start-position=900 > /tmp/2.sql

2. mysql> set sql_log_bin=0;

mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份

mysql> source /tmp/1.log //恢复最后个binlog文件

mysql> source /tmp/2.log //恢复最后个binlog文件

注意事项: 1. 完全恢复到一个干净的环境(例如新的数据库或删除原有的数据库) 2. 恢复期间所有SQL语句不应该记录到binlog中

备份脚本:

[root@localhost~]# vim /mysql_back.sql

#!/bin/bash

back_dir=/backup

back_file=`date +%F`_all.sql

user=root

pass=123

if [ ! -d /backup ];then

mkdir -p /backup

fi

# 备份并截断日志 mysqldump -u${user} -p${pass} --events --all-databases > ${back_dir}/${back_file}

mysql -u${user} -p${pass} -e 'flush logs'

# 只保留最近一周的备份 cd $back_dir

find . -mtime +7 -exec rm -rf {} \;

手动测试:

[root@localhost ~]# chmod a+x /mysql_back.sql

[root@localhost ~]# chattr +i /mysql_back.sql

[root@localhost ~]# /mysql_back.sql

配置cron:

[root@localhost ~]# crontab -l

2 * * * /mysql_back.sql

 

 

 

 

 

 

编写脚本备份:

#!/bin/bash -x

HOST=$1
PORT=$2
USER=$3
PASSWORD=$4
DBS=$5

MYSQL=`which mysql`
MYSQLDUMP=`which mysqldump`

DATE=`date +%Y%m%d%H`

BACKUP_PATH=$(cd `dirname $0`; pwd)
BACKUP_DIR="$BACKUP_PATH/backup/"
mkdir -p $BACKUP_DIR


if [ "ALL" ==  $DBS ]; then
  echo "IS NULL"
  # 查看mysql里面所有数据库名
  command="show databases"
  declare DBS=`$MYSQL -h${HOST} -P${PORT} -u${USER} -p${PASSWORD} -e "${command}"`
else
  echo "NOT NULL"
fi

for DB_NAME in $DBS
do
        if [ "$DB_NAME" != "information_schema" ] && [ "$DB_NAME" != "mysql" ] && [ "$DB_NAME" != "performance_schema" ] && [ "$DB_NAME" != "Database" ]
        then
        echo "$DB_NAME"

        # mysqldump出每个数据库的备份,并压缩
        $MYSQLDUMP --opt -h${HOST} -P${PORT} -u${USER} -p${PASSWORD} $DB_NAME | gzip > $BACKUP_DIR/$DB_NAME.dump_$DATE.sql.gz
        fi
done

 

posted @ 2020-04-01 18:56  stnnnn123  阅读(341)  评论(0)    收藏  举报