转载:mariadb/mysql定时备份脚本

在DOCKER下运行的要点

进入docker,使用:
bash /root/脚本名,否则会因为解释器报错

开启mariadb的binlog,修改my.cnf

server-id = 1
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index

全量备份脚本

#!/bin/bash
# 全备方式,一般在从机上执行,适用于小中型mysql数据库:
source /etc/profile # 加载系统环境变量
source ~/.profile # 加载用户环境变量
# 定义全局变量
#登录数据库用户名
user="root"
#访问数据库密码
password="prQX4e4CmmPiBhGZ"
#访问地址
host="localhost"
#访问数据库端口
port="3306"
#备份数据库名称,多个数据库用空格进行间隔
# db=("mydb") 可选
db=$(mysql -uroot -p密码 -e "show databases" | grep -Ev "Database|sys|information_schema")

local="--single-transaction"
#数据库位置
mysql_path="/var/lib/mysql"
#备份地址
backup_path="/tmp/mysql-backup"
date=$(date +%Y%m%d_%H:%M:%S)
day=30
#日志路径
backup_log="/var/log/mysql/mysql-backlog.log"
# 判断是否存在目录,不存在则创建目录
if [ ! -e $backup_path ];then
mkdir -p $backup_path
fi

# 删除30天以前备份
#find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1

echo "开始备份数据库: ${db[*]}"

# 备份数据库后压缩
backup_sql(){
  dbname=$1
#保存的文件名称
  backup_name="${dbname}_${date}.sql"
  mysqldump -h $host -P $port -u $user -p$password $lock --default-character-set=utf8 --flush-logs -R $dbname > $backup_path/$backup_name
  if [[ $? == 0 ]];then
    cd $backup_path
    # tar --force-local参数压缩带有冒号的压缩包
    tar czvf $backup_name.tar.gz $backup_name --force-local
    size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
    rm -rf $backup_name
    echo "$date 备份 $dbname($size) 成功"
  else
    cd $backup_path
    rm -rf $backup_name
    echo "$date 备份 $dbname 失败"
  fi
}

# 多个库循环备份
#length=${#db[@]}
#for ((i=0;i<$length;i++));do
for db in $db;do
  backup_sql ${db[i]} >> $backup_log 2>&1
done

echo "备份结束,结果查看 $backup_log"
du $backup_path/*$date* -sh | awk '{print "文件:" $2 ",大小:" $1}'

增量备份脚本

#!/bin/bash
# 增量备份方式,在从机上执行,适用于中大型mysql数据库
# 同时数据库配置文件必须开启binlog二进制文件


source /etc/profile # 加载系统环境变量
source ~/.profile # 加载用户环境变量
# 定义全局变量
#存放二进制备份文件的压缩包目录
backup_path="/tmp/mysql-bin-backup"
#二进制备份文件所在位置
mysqlbin_path="/var/lib/mysql/mariadb-bin"

backup_log="/var/log/mysql/mysql-binbacklog.log"
#二进制日志的索引文档
mysqlbinfile="/var/lib/mysql/mariadb-bin.index"
date=$(date +%Y%m%d_%H:%M:%S)
day=30

# 刷新新的mysql-bin.0000*文件
mysqladmin -uroot -pprQX4e4CmmPiBhGZ flush-logs

statistics=`cat $mysqlbinfile|wc -l`
num=0
# 判断是否存在目录,不存在则创建目录
if [ ! -e $backup_path ];then
  mkdir -p $backup_path
fi

# 删除30天以前备份
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1

# for循环对比是否存在或是否为最新的文件
echo "开始备份数据库: ..."
for file in `cat $mysqlbinfile`
do
  # basename用于截取mysql-bin.0000*文件名,去掉./mysql-bin.0000*前面的./
  dbname=`basename $file`
  backup_name=`basename $file`_$date
  statistics=`expr $num + 1`
  cd $backup_path
  # 判断是否刷新二进制文件
  if [ $num != $statistics ];then
    dest=$backup_path/$dbname*
    # 判断二进制文件是否存在于要压缩的目录,不存在则备份至此目录
    if [ ! -e $dest ];then
      #拷贝二进制文件到存放压缩包的目录,为接下来压缩做准备
      cp $mysqlbin_path/$dbname $backup_path/
      # --force-local,压缩文件若带有冒号需要加上--force-local参数进行压缩解压操作
      tar czvf $backup_name.tar.gz $dbname --force-local
      size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
      rm -rf $dbname
      echo "$dbname 备份 $dbname($size) 成功" >> $backup_log
      du $backup_path/* -sh | grep mysql-bin | awk '{print "文件:" $2 ",大小:" $1}'
    else
      echo "$dbname 备份 $dbname 已存在" >> $backup_log
      continue
    fi
  fi
  num+=1
done
 
echo "备份结束,结果查看 $backup_log"
du $backup_path/* -sh | grep mysql-bin | awk '{print "文件:" $2 ",大小:" $1}'

全量备份还原

[root@localhost mysql_back]#tar --force-local -zxvf LOGLEO.000015_20200708_09:17:27.tar.gz

[root@localhost mysql_back]# mysql -uroot -p你的mysql密码 要还原的数据库名 </home/mysql-back/LOGLEO.000015_20200708_09:17:27.log

增量备份还原

**查看自己的二进制目录**
[root@localhost ~]#cd /home/mysql-binback
[root@localhost mysql_binback]# ls
LOGLEO.000014_20200708_09:41:21.tar.gz
LOGLEO.000015_20200708_09:41:21.tar.gz
LOGLEO.000017_20200708_09:44:58.tar.gz
LOGLEO.000018_20200708_11:03:15.tar.gz
LOGLEO.000019_20200708_11:07:31.tar.gz
LOGLEO.000020_20200708_11:08:15.tar.gz
LOGLEO.000021_20200708_13:54:59.tar.gz
LOGLEO.000022_20200709_01:00:01.tar.gz
LOGLEO.000023_20200710_01:00:01.tar.gz

**解压文件操作**
[root@localhost mysql_binback]# tar --force-local -zxvf LOGLEO.000023_20200710_01:00:01.tar.gz 
LOGLEO.000023


[root@localhost mysql_binback]#mysqlbinlog  LOGLEO.000023 | mysql -uroot -p你的数据库密码

nginx禁止空主机头(使用服务器ip直接访问)

新增server{}段,加入以下内容:

server {
listen 80 default;
listen 443 default_server;
server_name _;
return 403;
server_tokens off;
#error_page 404/404.html;
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
}

docker容器日志大小设定

全局设置

vim /etc/docker/daemon.json

{
  "registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}

单个容器编排

nginx: 
  image: nginx:1.18-alpine 
  restart: always 
  logging: 
    driver: "json-file"
    options: 
      max-size: "5g"

删除容器日志

cat /dev/null > /var/lib/docker/containers/容器id/容器id-json.log

DOCKER删除不需要的资源

docker system prune [OPTIONS]

--all , -a      Remove all unused images not just dangling ones
--filter        Provide filter values (e.g. ‘label==')
--force , -f    Do not prompt for confirmation
--volumes       Prune volumes

查看磁盘使用情况

docker system df

删除未被正在运行容器使用的卷

docker system prune -a --volumes

基于alpine镜像,修改容器时区的处理方式

编辑Dockerfile,内容如下:

FROM alpine:3.9
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk update && apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata

如果使用其他基于alpine的镜像,例如nginx:alpine等等,也可以参照如上方式处理

TOMCAT的一些小配置

修改tomcat默认首页

在server.xml的<HOST></HOST>段中间,新增如下内容:

<Context path="" docBase="/var/www/html/" debug="0"/>

nginx反向代理HTTPS后,tomcat的一些补充配置

在server.xml的<HOST></HOST>段中间,新增如下内容:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>

DOCKER下玩MySql(MariaDB)的一些小坑

实际开发过程中,开发小伙伴一般都用的是WINDOWS环境,大小写就是个非常讨厌的问题。下面用个笨办法解决这个问题。

先跑起来一个MySql容器

docker-compose.yml如下:

version: '3'
services:
        mysql:
                image: mysql:5.7
        ports:
                - 3306:3306
        volumes:
                - ./mysql-data:/var/lib/mysql
                - ./mysql:/etc/mysql

将容器运行,编辑./mysql下的my.cnf或者相关配置文件,针对大小写敏感,添加如下项:

[mysqld]
lower_case_table_names = 1

然后重启容器,建议使用如下命令:

docker-compose down && docker-compose up -d

这时候,小伙伴们就可以愉快的使用数据库了

mariadb/MYSQL时区问题的解决

在mysqld段增加

default-time-zone = '+8:00' ## 修改数据库时区

切记,必须重置数据库,即删除数据库卷才可以

DOCKER下遇见的时区问题

JAR包的时区问题:

Dockerfile中的CMD段如下:

CMD ["java","-jar","-Duser.timezone=GMT+08","-Xms256m","-Xmx256m","xxx.jar",">>/dev/null","&"]

docker-compose.yml的volumes段如下:

volumes:
- /etc/localtime:/etc/localtime:ro

如果直接在docker-compose.yml直接运行jar包,command段要采用如下写法:

command java -Xms256m -Xmx256m -Duser.timezone=GMT+08 -jar xxx.jar

MYSQL遇见的时区问题

my.cnf中[mysqld]段增加如下:

default-time-zone = '+8:00'

docker-compose.yml中的volumes段增加如下:

/etc/localtime:/etc/localtime:ro

environment段增加如下

TZ=Asia/Shanghai