准备工作

  1. 两台debian系统的服务器A和B,安装rsysnc软件

    apt-get install rsysnc
  2. 设置ssh免密rsa登录

    # 在A服务器上运行命令:
    ssh-keygen -t rsa
    # 下面为对应密钥生成地址  公钥(id_rsa.pub)和私钥(id_rsa)。
    #   windows:    C:\Users\<your_username>\.ssh
    #   linux:       /home/service/.ssh     
  3. 将密钥写入到对应文件

    # 把在A服务器上生成的id_rsa.pub上传到B服务器
    # 同时在B服务器上,把id_rsa.pub秘钥,导入到authorized_keys中
    echo "id_rsa.pub" >> ~/.ssh/authorized_keys
    # 经过上面步骤,可以实现A免密码登录B服务器。
  4. B服务器备份脚本

    #!/bin/bash
    DBUSR=root
    DBPWD=123456
    DBNAME=typecho
    DBPATH=/mnt/backup/
    
    LOG=$DBPATH'backup.log'
    # mysql data stored dir
    TODAY=`date +%F`
    STOREDIR=$DBPATH$TODAY
    mkdir $STOREDIR
    echo "***Start backup PATH:$STOREDIR***" >> $LOG
    # delete overtime backup files
    rm -rf $DBPATH$(date +%F --date='7 days ago')
    
    # backup data file
    cd /mnt/www/ && tar -czPf $STOREDIR/typecho.tar.tgz typecho &&
    /usr/bin/docker exec mariadb /usr/bin/mysqldump --column-statistics=0 -u$DBUSR --password=$DBPWD --databases $DBNAME --lock-all-tables --flush-logs |gzip>$STOREDIR/$DBNAME.sql.gz

注意:脚本报错:OCI runtime exec failed: exec failed: unable to start container process: exec: "/usr/bin/mysqldump": stat /usr/bin/mysqldump: no such file or directory: unknown

容器没有安装mysql客户端,进入容器并安装mysql客户端

docker exec -it mariadb bash
apt-get update && apt-get install -y mysql-client

注意:脚本报错mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'typecho' AND TABLE_NAME = 'typecho_comments';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109)

问题出现在尝试使用 mysqldump 工具备份数据库时,遇到了 Unknown table 'COLUMN_STATISTICS' in information_schema 的错误。这通常发生在尝试从 information_schema.COLUMN_STATISTICS 表中选择数据时,但该表在 information_schema 数据库中不存在。

这个问题在 MySQL 8.0 版本中尤为常见,因为在 MySQL 8.0 中,COLUMN_STATISTICS 表是新引入的,而在之前的版本中并不存在。如果您的 mysqldump 工具是针对 MySQL 8.0 或更高版本设计的,而您的数据库服务器运行的是旧版本的 MySQL,那么您可能会遇到这个问题。

为了解决这个问题,您可以尝试以下几种方法:

  1. 升级数据库服务器:如果您的应用程序和环境支持,可以考虑升级您的数据库服务器到 MySQL 8.0 或更高版本。

  2. 修改 mysqldump 命令:如果您无法升级数据库服务器,您可以尝试修改 mysqldump 命令,添加 --column-statistics=0 参数来禁用对 COLUMN_STATISTICS 表的查询。例如:

    mysqldump --column-statistics=0 -uroot --password='123456' --databases typecho --lock-all-tables --flush-logs | gzip > /mnt/typecho.sql.gz
  3. 修改 MySQL 配置文件:在 /etc/my.cnf~/.my.cnf 中添加以下内容,然后重启 MySQL 服务:

    [mysqldump]
    column-statistics=0
  4. 使用其他备份方法:如果上述方法都不适用,您可能需要考虑使用其他备份方法,例如使用物理备份工具(如 Percona XtraBackup)或者使用数据库管理工具(如 MySQL Workbench)进行备份。

具体操作

A作为备份服务器,同步备份B服务器上指定文件夹:

rsync -avzr --delete --progress -e 'ssh -p 22' root@192.168.1.21:/mnt/backup/ /mnt/user/www/backup/