一、查看binlog是否开启

  1. mysql> show variables like '%log_bin%';
  2. +---------------------------------+---------------------------------------------+
  3. | Variable_name | Value |
  4. +---------------------------------+---------------------------------------------+
  5. | log_bin | OFF |
  6. | log_bin_basename | /var/lib/mysql/mysql-bin |
  7. | log_bin_index | /var/lib/mysql/mysql-bin.index |
  8. | log_bin_trust_function_creators | OFF |
  9. | log_bin_use_v1_row_events | OFF |
  10. | sql_log_bin | OFF |
  11. +---------------------------------+---------------------------------------------+
  12. 6 rows in set (0.01 sec)

参数说明

  • log_bin binlog是否开启 (ON 是已开启, OFF 是未开启)
  • log_bin_basename binlog的前缀位置及名称
  • log_bin_index binlog的索引位置及名称

    二、开启binlog

    查看mysql的数据存储位置

    ```shell [root@localhost ~]# vim /etc/my.cnf [mysqld]

    Remove leading # to turn on a very important data integrity option: logging

    changes to the binary log between backups.

    binlog未开启

    log-bin

Remove leading # to set options mainly useful for reporting servers.

The server defaults are faster for transactions and fast SELECTs.

Adjust sizes as needed, experiment to find the optimal values.

join_buffer_size = 128M

sort_buffer_size = 2M

read_rnd_buffer_size = 2M

datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock

Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

  1. datadir mysql的数据存储位置, 如果开启binlog开启之后, 默认会存储在这个目录, 为方便管理, 重新创建个目录统一存放binlog
  2. <a name="RyyZm"></a>
  3. #### 创建binlog目录
  4. ```shell
  5. [root@localhost ~]# cd /var/lib/mysql
  6. [root@localhost mysql]# mkdir mysql-binlog
  7. [root@localhost mysql]# chown -R mysql:mysql mysql-binlog
  8. [root@localhost mysql]# ll
  9. 总用量 122960
  10. drwxr-x---. 2 mysql mysql 52 5月 5 20:26 aa
  11. -rw-r-----. 1 mysql mysql 56 5月 5 15:01 auto.cnf
  12. drwxr-x---. 2 mysql mysql 20 5月 5 20:29 bbb
  13. -rw-------. 1 mysql mysql 1676 5月 5 15:01 ca-key.pem
  14. -rw-r--r--. 1 mysql mysql 1112 5月 5 15:01 ca.pem
  15. -rw-r--r--. 1 mysql mysql 1112 5月 5 15:01 client-cert.pem
  16. -rw-------. 1 mysql mysql 1680 5月 5 15:01 client-key.pem
  17. -rw-r-----. 1 mysql mysql 390 5月 6 11:37 ib_buffer_pool
  18. -rw-r-----. 1 mysql mysql 12582912 5月 7 10:12 ibdata1
  19. -rw-r-----. 1 mysql mysql 50331648 5月 7 10:12 ib_logfile0
  20. -rw-r-----. 1 mysql mysql 50331648 5月 5 15:01 ib_logfile1
  21. -rw-r-----. 1 mysql mysql 12582912 5月 7 10:12 ibtmp1
  22. drwxr-x---. 2 mysql mysql 4096 5月 5 15:01 mysql
  23. -rw-r-----. 1 mysql mysql 177 5月 5 16:08 mysql-bin.000001
  24. -rw-r-----. 1 mysql mysql 32 5月 5 15:59 mysql-bin.index
  25. drwxr-xr-x. 2 mysql mysql 173 5月 7 10:12 mysql-binlog
  26. srwxrwxrwx. 1 mysql mysql 0 5月 7 10:12 mysql.sock
  27. -rw-------. 1 mysql mysql 5 5月 7 10:12 mysql.sock.lock
  28. drwxr-x---. 2 mysql mysql 8192 5月 5 15:01 performance_schema
  29. -rw-------. 1 mysql mysql 1676 5月 5 15:01 private_key.pem
  30. drwxr-x---. 2 mysql mysql 20 5月 5 15:03 pro_wms_test
  31. -rw-r--r--. 1 mysql mysql 452 5月 5 15:01 public_key.pem
  32. -rw-r--r--. 1 mysql mysql 1112 5月 5 15:01 server-cert.pem
  33. -rw-------. 1 mysql mysql 1680 5月 5 15:01 server-key.pem
  34. drwxr-x---. 2 mysql mysql 8192 5月 5 15:01 sys

开启binlog

打开log-bin的注释,设置为刚才创建的目录,文件前缀为mysql-bin, 添加server-id(单机都可以, 集群不能重复)

  1. [root@localhost ~]# vim /etc/my.cnf
  2. [mysqld]
  3. #
  4. # Remove leading # and set to the amount of RAM for the most important data
  5. # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
  6. # innodb_buffer_pool_size = 128M
  7. #
  8. # Remove leading # to turn on a very important data integrity option: logging
  9. # changes to the binary log between backups.
  10. server-id=1
  11. log_bin=/var/lib/mysql/mysql-binlog/mysql-bin
  12. # Remove leading # to set options mainly useful for reporting servers.
  13. # The server defaults are faster for transactions and fast SELECTs.
  14. # Adjust sizes as needed, experiment to find the optimal values.
  15. # join_buffer_size = 128M
  16. # sort_buffer_size = 2M
  17. # read_rnd_buffer_size = 2M
  18. datadir=/var/lib/mysql
  19. socket=/var/lib/mysql/mysql.sock

重启mysql

  1. [root@localhost mysql]# systemctl restart mysqld
  2. [root@localhost mysql]# ps aux | grep mysql
  3. mysql 2124 2.5 4.4 1119476 173900 ? Sl 10:49 0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  4. root 2153 0.0 0.0 112824 984 pts/2 S+ 10:49 0:00 grep --color=auto mysql

查看binlog是否开启

  1. mysql> show variables like '%log_bin%';
  2. +---------------------------------+---------------------------------------------+
  3. | Variable_name | Value |
  4. +---------------------------------+---------------------------------------------+
  5. | log_bin | ON |
  6. | log_bin_basename | /var/lib/mysql/mysql-binlog/mysql-bin |
  7. | log_bin_index | /var/lib/mysql/mysql-binlog/mysql-bin.index |
  8. | log_bin_trust_function_creators | OFF |
  9. | log_bin_use_v1_row_events | OFF |
  10. | sql_log_bin | ON |
  11. +---------------------------------+---------------------------------------------+
  12. 6 rows in set (0.00 sec)

binlog开启成功

查看生成的binlog文件

刚开始可能会没有, 操作后会生成

  1. [root@localhost mysql-binlog]# cd /var/lib/mysql/mysql-binlog
  2. [root@localhost mysql-binlog]# ls
  3. mysql-bin.000001 mysql-bin.index

binlog相关命令

  1. # 查看生成的binlog内容, 默认是我们看不懂的, 可通过下面的命令转为能看懂的
  2. /usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/mysql-binlog/mysql-bin.000001 | more
  3. # 把binlog转为人能看懂的
  4. /usr/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS /var/lib/mysql/mysql-binlog/mysql-bin.000001
  5. [root@localhost mysql-binlog]# /usr/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000001
  6. # 数据恢复
  7. # 恢复全部数据
  8. /usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000002 | mysql -uroot -p
  9. # 恢复恢复某数据库的数据
  10. /usr/bin/mysqlbinlog --no-defaults --database=xxx /var/lib/mysql/mysql-bin.000002 | mysql -uroot -p
  11. # 恢复指定位置数据
  12. /usr/bin/mysqlbinlog --no-defaults --start-position="204" --stop-position="556" /var/lib/mysql/mysql-bin.000002 | mysql -uroot -p
  13. # 恢复指定时间段数据
  14. /usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000002 --stop-date= "2022-04-19 12:00:00" --start-date= "2022-04-19 11:55:00" | mysql -uroot -p
  15. # 将数据导入sql文件中
  16. /usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000002 > /tmp/aa.sql

三、备份binlog

创建binlog备份目录

  1. [root@localhost ]# cd /home/cmstxa/open/mysql5.7
  2. [root@localhost mysql5.7]# mkdir back-binlog
  3. [root@localhost mysql5.7]# cd back-binlog
  4. [root@localhost mysql5.7]# mkdir back-binlog # binlog归档目录
  5. [root@localhost mysql5.7]# mkdir temp-binlog # binlog备份操作的临时目录

编写备份脚本

  1. [root@localhost mysql5.7]# touch back-binlog.sh # binlog 备份的脚本
  2. [root@localhost mysql5.7]# chmod +x back-binlog.sh # 给脚本添加执行权限
  3. [root@localhost back-binlog]# vim back-binlog.sh
  1. #!/bin/bash
  2. # /mysql/backup/sh/backup_mysql_binlog.sh
  3. MYSQL_BAK_BIN_FILE=mysql-bin.`date +%Y%m%d%H`.tar.gz
  4. MYSQL_BAK_DEST_GZ_LOCALHOST='/home/cmstxa/open/mysql5.7/back-binlog/back-binlog'
  5. # 备份binlog的位置 目标位置
  6. MYSQL_BAK_BIN_LOCATION='/var/lib/mysql/mysql-binlog'
  7. MYSQL_BAK_DEST_LOCATION='/home/cmstxa/open/mysql5.7/back-binlog/temp-binlog'
  8. # 删除90天之前的数据
  9. find ${MYSQL_BAK_DEST_GZ_LOCALHOST} -mtime +90 -name 'mysql-bin.*' -exec rm -rf {} \;
  10. # 删除临时文件夹的数据
  11. rm -fr ${MYSQL_BAK_DEST_LOCATION}/*
  12. # 复制一天内的binlog,并保留文件属性
  13. find ${MYSQL_BAK_BIN_LOCATION} -mtime -1 -name 'mysql-bin.*' -exec cp -f -p {} ${MYSQL_BAK_DEST_LOCATION} \;
  14. echo ${MYSQL_BAK_BIN_LOCATION} files done cp ;
  15. cd ${MYSQL_BAK_DEST_LOCATION} \;
  16. tar -czvf ${MYSQL_BAK_BIN_FILE} mysql-bin.*
  17. mv ${MYSQL_BAK_BIN_FILE} ${MYSQL_BAK_DEST_GZ_LOCALHOST}

测试备份脚本

  • 产生binlog后再测试
    1. [root@localhost back-binlog]# ./back-binlog.sh
    2. /var/lib/mysql/mysql-binlog files done cp
    3. mysql-bin.000001
    查看 /home/cmstxa/open/mysql5.7/back-binlog/back-binlog 目录下是否产生备份文件, 并按照上述方法测试文件是否可用

    编写定时备份脚本

    此处定时备份用的是linux的crontab服务, 没有的话需要安装
    编写脚本 (脚本需要写全路径), 有多个任务写多行
    当crontab存在一个任务后, 同一个用户添加后续任务使用 crontab -e 命令
    1. [root@localhost back-binlog]# touch back-binlog.cron
    2. [root@localhost back-binlog]# vim back-binlog.cron
    3. 5 0 * * * /home/cmstxa/open/mysql5.7/back-binlog/back-binlog.sh
    前面的是cron表达式, 后面是脚本路径

    加入定时任务

    1. [root@localhost back-binlog]# crontab back-binlog.cron

    查看定时任务

    1. [root@localhost back-binlog]# crontab -l
    2. 5 0 * * * /home/cmstxa/open/mysql5.7/back-binlog/back-binlog.sh

    测试定时任务

    可以把时间设的短一点, 查看备份文件是否生成, 并按照周期时间观测几次

四、备份sql文件

备份sql文件用的是MySQL的mysqldump工具

创建sql备份目录

  1. [root@localhost ]# cd /home/cmstxa/open/mysql5.7
  2. [root@localhost mysql5.7]# mkdir back-sqllog
  3. [root@localhost mysql5.7]# cd back-sqllog
  4. [root@localhost mysql5.7]# mkdir back-sqllog # sqllog归档目录
  5. [root@localhost mysql5.7]# mkdir temp-sqllog # sqllog备份操作的临时目录

编写备份脚本

  1. [root@localhost mysql5.7]# touch back-sqllog.sh # sqllog 备份的脚本
  2. [root@localhost mysql5.7]# chmod +x back-sqllog.sh # 给脚本添加执行权限
  3. [root@localhost back-sqllog]# vim back-sqllog.sh

需要用户名和密码

  1. #!/bin/bash
  2. # /mysql/backup/sh/backup_mysql_splite_db.sh
  3. MYSQL_USER="xxxx"
  4. MYSQL_USER_PASSWORD='xxxx'
  5. MYSQL_BAK_DATABASES="xxxx"
  6. # 数据临时目录
  7. MYSQL_BAK_DIRECTORY="/home/cmstxa/open/mysql5.7/back-sqllog/temp-sqllog"
  8. MYSQL_BAK_FILE_PREFIX=mysql.`date +%Y%m%d%H`.
  9. MYSQL_BAK_FILE_SUFFIX=.sql.gz
  10. #数据归档目录
  11. MYSQL_BAK_DEST_GZ_DIRECTORY='/home/cmstxa/open/mysql5.7/back-sqllog/back-sqllog'
  12. # 删除90天之前的数据
  13. find ${MYSQL_BAK_DEST_GZ_DIRECTORY} -mtime +90 -name 'mysql.*' -exec rm -rf {} \;
  14. rm -fr ${MYSQL_BAK_DIRECTORY}/*
  15. for dbName in $MYSQL_BAK_DATABASES;
  16. do
  17. ## 备份指定databases
  18. mysqldump -u${MYSQL_USER%} -p${MYSQL_USER_PASSWORD} --databases ${dbName} --single-transaction --hex-blob -R |gzip > ${MYSQL_BAK_DIRECTORY}/$MYSQL_BAK_FILE_PREFIX$dbName$MYSQL_BAK_FILE_SUFFIX
  19. mv ${MYSQL_BAK_DIRECTORY}/$MYSQL_BAK_FILE_PREFIX$dbName$MYSQL_BAK_FILE_SUFFIX ${MYSQL_BAK_DEST_GZ_DIRECTORY}
  20. echo $MYSQL_BAK_FILE_PREFIX$dbName$MYSQL_BAK_FILE_SUFFIX done backup ;
  21. done

测试备份脚本

  1. [root@localhost back-sqllog]# ./back-sqllog.sh

查看 /home/cmstxa/open/mysql5.7/back-sqllog/back-sqllog目录下是否产生备份文件, 并按照周期时间观测几次

编写定时任务脚本

此处定时备份用的是linux的crontab服务, 没有的话需要安装
编写脚本 (脚本需要写全路径), 有多个任务写多行
当crontab存在一个任务后, 同一个用户添加后续任务使用 crontab -e 命令
因为上面已经加了一个任务, 第二个任务直接使用crontab -e编辑, 在下面加一行

  1. [root@localhost back-sqllog]# crontab -e
  2. 5 0 * * * /home/cmstxa/open/mysql5.7/back-binlog/back-binlog.sh
  3. 5 0 * * * /home/cmstxa/open/mysql5.7/back-sqllog/back-sqllog.sh

前面的是cron表达式, 后面是脚本路径

查看定时任务

  1. [root@localhost back-sqllog]# crontab -l
  2. 5 0 * * * /home/cmstxa/open/mysql5.7/back-binlog/back-binlog.sh
  3. 5 0 * * * /home/cmstxa/open/mysql5.7/back-sqllog/back-sqllog.sh

测试定时任务

可以把时间设的短一点, 查看备份文件是否生成, 并按照周期时间观测几次