• 144802

    文章

  • 854

    评论

  • 13

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

mysql数据库备份


环境

系统:centos7.5
MySql:mysql-5.7.23
数据库目录:/data/mysql
Rsync: rsync-3.1.2
10.0.0.11: mysql rsync客户端
10.0.0.12: rsync服务端

需求

1)每天备份一次,需要备份所有的库
2)把备份数据存放到/data/backup/下
3)备份文件名称格式示例:database_name-2018-11-11.sql
4)需要对每天所有sql文件压缩,格式为gzip
5)本地数据保留1周
6)需要把备份的数据同步到远程服务器,本机可以直接通过rsync命令同步
7)远程备份数据要求保留1个月

实施

10.0.0.11

1.安装MySql

curl -O https://gitee.com/yx571304/my_oschina/raw/master/mysql/mysql-install-bin.sh
sh mysql-install-bin.sh

2.创建备份用户授权

# 生成10位数随机密码
dumperpwd=$(cat /dev/urandom | tr -dc 'a-z,A-Z,0-9,.,*,@,#' | head -c 10)
echo -e "MySql Backup\n\t\tUser: dumper\n\t\tPassword: $dumperpwd"

# 创建数据库备份用户dumper仅允许 127.0.0.1本地登陆
mysql -e "
  create user dumper@'127.0.0.1' identified by \"$dumperpwd\";
  grant select on *.* to dumper@'127.0.0.1';
  grant show view on *.* to dumper@'127.0.0.1';
  grant lock tables on *.* to dumper@'127.0.0.1';
  grant trigger on *.* to dumper@'127.0.0.1';"

# 将密码写入配置文件实现免密码
echo """
[mysqldump]
user = dumper
password = $dumperpwd
""" >>/etc/my.cnf

3.生成测试数据

# 创建数据库及表
for db in db1 db2 db3 db4 db5
do
mysql -e "
CREATE DATABASE $db;USE $db;
CREATE TABLE IF NOT EXISTS runoob_tbl (
   runoob_id INT UNSIGNED AUTO_INCREMENT,
   runoob_title VARCHAR(100) NOT NULL,
   runoob_author VARCHAR(40) NOT NULL,
   submission_date DATE,
   PRIMARY KEY (runoob_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
desc runoob_tbl"
done

# 插入数据
for db in db1 db2 db3 db4 db5
do
    mysql -te "
      USE $db;
      INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ('学习 PHP', '菜鸟教程', NOW());
      INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ('学习 MySQL', '菜鸟教程', NOW());
      INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ('JAVA 教程', 'RUNOOB.COM', '2016-05-06');"
done

# 验证
for db in db1 db2 db3 db4 db5
do
    echo "--------------- $db ---------------"
    mysql -e "USE $db; SELECT * FROM runoob_tbl;"
done

4.安装Rsync

yum install -y rsync

10.0.0.12

0.安装Rsync

yum install -y rsync

1.配置Rsync

# 创建备份存储路径
mkdir /data/{backmysql,backup}

# 创建Rsync配置文件
cat <<EOF    >/etc/rsyncd.conf
uid = root
gid = root
port = 873
#list = false
use chroot = no
strict modes = yes
max connections = 10

pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log

timeout = 900
exclude = lost+found/
transfer logging = yes
ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

[bakmysql]
ignore errors
read only = false
write only = false
path = /data/backmysql
comment = mysql backup
auth users = test, feng
hosts deny = 0.0.0.0/32
hosts allow = 10.0.0.0/24
secrets file = /etc/rsyncd.secrets

[back]
ignore errors
read only = false
write only = false
path = /data/back
comment = backup
auth users = test, feng
hosts deny = 0.0.0.0/32
hosts allow = 10.0.0.0/24
secrets file = /etc/rsyncd.secrets
EOF

# 创建密码文件,设置文件权限,启动服务
echo 'test:123456' >/etc/rsyncd.secrets
echo 'feng:123456' >/etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets

2.启动服务并跟随系统启动

systemctl start rsyncd
systemctl enable rsyncd

3.配置防火墙及Selinx

firewall-cmd --zone=public --add-port=873/tcp --permanent
firewall-cmd --reload
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

10.0.0.11

0.创建备份脚本

mkdir /script

cat <<'EOF'   >/script/backup_mysql.sh
#!/usr/bin/env bash

# 数据库备份脚本
# 本地备份保留一周, 远程备份保留一个月
# 日期: 2018-11-05
# 版本: V1

# 定义变量
mysqldump='/usr/local/mysql/bin/mysqldump'
bakdir='/data/backup'
remote_dir='rsync://feng@10.0.0.12/bakmysql'
pass_file='/etc/rsync.password'
d1=$(date +%F)
d2=$(date +%d)

# 定义日志
exec &> /tmp/mysql_bak.log
echo "mysql backup begin at `date`"

# 遍历数据库
for db in db1 db2 db3 db4 db5
do
    $mysqldump $db > $bakdir/$db-$d1.sql
done

# 压缩所有sql文件
find $bakdir/ -type f -name "*.sql" | xargs gzip

# 查找一周以前的备份文件, 并删除
find $bakdir/ -type f -mtime +7 | xargs rm -f


# 把当天的备份文件同步到远程
for db in db1 db2 db3 db4 db5
do
    rsync -a --password-file=$pass_file $bakdir/$db-$d1.sql.gz $remote_dir/$db-$d2.sql.gz
done

echo 'mysql backup end at 'date''
EOF

1.创建密码文件

echo '123456' >/etc/rsync.password
chmod 600 /etc/rsync.password

1.创建计划任务

chmod +x /script/backup_mysql.sh
echo "10 2 * * * /script/backup_mysql.sh" >/tmp/crontab_mysql
crontab /tmp/crontab_mysql

知识点

MySql

MySql安装

curl -O https://gitee.com/yx571304/my_oschina/raw/master/mysql/mysql-install-bin.sh
sh mysql-install-bin.sh

0.创建备份用户,授权

# 生成10位数随机密码
dumperpwd=$(cat /dev/urandom | tr -dc 'a-z,A-Z,0-9,.,*,@,#' | head -c 10)
echo -e "MySql Backup\n\t\tUser: dumper\n\t\tPassword: $dumperpwd"

# 创建数据库备份用户dumper仅允许 127.0.0.1本地登陆
mysql -uroot -psfd3sDGR -e "
  create user dumper@'127.0.0.1' identified by \"$dumperpwd\";
  grant select on *.* to dumper@'127.0.0.1';
  grant show view on *.* to dumper@'127.0.0.1';
  grant lock tables on *.* to dumper@'127.0.0.1';
  grant trigger on *.* to dumper@'127.0.0.1';"

# 将密码写入配置文件实现免密码
echo """
[mysqldump]
user = dumper
password = $dumperpwd
""" >>/etc/my.cnf

1.本地数据库备份

mysqldump -udumper -pYVdwpZXccS db_name > db.sql

2.远程数据库备份

mysqldump -udumper -pYVdwpZXccS -h 192.168.100.10 -P 3306 db_name > db.sql

3.只备份表结构

mysqldump -udumper -pYVdwpZXccS -d db_name > db.sql

4.只备份数据

mysqldump -udumper -pYVdwpZXccS -t db_name > db.sql

5.只备份指定表

mysqldump -udumper -pYVdwpZXccS db_name tab_name > db.sql

6.备份全部数据库

mysqldump -udumper -pYVdwpZXccS -A > db.sql

7.备份指定多个数据库

mysqldump -udumper -pYVdwpZXccS -B db1_name db2_name db3_name > db.sql

8. --master-data

我们在使用mysqldump工具备份时,偶尔会用到--master-data选项,它可以在导出时增加binlog文件的位置和change master语句(这样有助于我们做从库)。这个选项有两个值,分别为--master-data=1和--master-data=2。如果值等于1,就会添加一个CHANGE MASTER语句,如果值等于2,就会在CHANGE MASTER语句前添加注释,这个参数会--lock-all-tables锁表,除非你指定了--single-transaction。

date

date命令常见用法

命令                           显示结果                 说明
date +%T                       13:41:16                时间
date +%H                       13                      小时
date +%M                       41                      分
date +%S                       16                      秒
date +%s                       1541569276              时间戳(1970-01-01 00:00:00 GMT过去多少秒)
date +%F                       2018-11-07              当前的日期
date +%Y                       2018                    四位年份
date +%y                       18                      两位年份
date +%m                       11                      月
date +%d                       07                      日
date +%w                       3                       周几
date +%W                       45                      本年度第几周
date -d '-1 day' +%F           2018-11-06              昨天的日期
date -d '-1 month' +%F         2018-10-07              一个月之前的日期
date  +'%F %T'                 2018-10-07 13:41:16     格式化输出日期时间

find

0.查找log目录下一周之前的文件

find /var/log/ -type f -mtime +7

**1.查找etc目录下以.cnf结尾的文件

find /etc/ -type f -name "*.cnf"

**2.查找当前目录下所有权限为777的目录

find . -type d -perm 777

**3.查资/tmp下大小超过1MB的文件

find /tmp/ -size +1M

**4.查找当前目录下10天之前的文件并删除

find . -type f -mtime +10 -exec rm -f {} \;

还可以使用 xargs命令形式

find . -type f -mtime +10 | xargs rm -f

rsync

0.同步一个目录

rsync -av /source_dir/ user[@ip](https://my.oschina.net/u/3749391)::module_name/dest_dir

rsync -av --password-file=/etc/rsync.password /source_dir/ user[@ip](https://my.oschina.net/u/3749391)::module_name/dest_dir

# -a 归档模式,表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD
# -r 对子目录以递归模式处理,主要是针对目录来说的,如果单独传一个文件不需要加-r,但是传输的是目录必须加-r选项
# -v 传输过程中显示速率,文件数量等信息
# -l 保留软链接
# -L 向对待常规文件一样处理软链结,如果是SRC中有软连接文件,则加上该选项后将会把软连接指向的目标文件拷贝到DST
# -p 保持文件权限
# -o 保持文件属主信息
# -g 保持文件属组信息
# -D 保持设备文件信息
# -t 保持文件时间信息
# --delete 删除DST中有 SRC中没有的文件
# --exclude=PATTERN 指定排除不需要传输的文件,等号后面跟文件名,可以是万用字符模式(如*.txt)
# --progress 在同步的过程中可以看到同步的过程状态,比如统计要同步的文件数量、同步的文件传输速度等等
# -u 加上这个选项后将会把DST中比SRC还新的文件排除掉,不会覆盖

gzip

0.压缩(gzip仅支持压缩文件,不支持压缩目录)

gzip file

1.解压

gzip -d file.gz

695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

0条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤 主体内容背景
打开支付宝扫码付款购买视频教程
遇到问题联系客服QQ:419400980
注册梁钟霖个人博客