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
0条评论