为服务器添加定时脚本+备份数据库
首先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
                    
                
                
            
        
浙公网安备 33010602011771号