AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 807618
Accepted
alexw
alexw
Asked: 2016-10-07 17:29:27 +0800 CST2016-10-07 17:29:27 +0800 CST 2016-10-07 17:29:27 +0800 CST

如何使用 Duplicity 将 Ubuntu VPS 上的实时 MySQL 数据库自动加密备份到 Google Drive?

  • 772

我们使用 DigitalOcean 作为我们的 VPS 提供商。他们有一个关于如何为加密备份设置 Duplicity 的教程,但它不包括数据库备份或 Google Drive 端点。

我在网上找到了一些关于 Duplicity 和 Google Drive 的其他教程,但它们似乎都不完整或过时。

backup mysql gpg google-drive duplicity
  • 1 1 个回答
  • 1801 Views

1 个回答

  • Voted
  1. Best Answer
    alexw
    2016-10-07T17:29:27+08:002016-10-07T17:29:27+08:00

    我花了 12 个多小时才拼凑出我需要的所有信息,但过程如下:

    第 1 步:谷歌帐户

    选择一个现有的或创建一个新的 Google 帐户,您将在其中存储备份。我喜欢拥有一个单独的帐户,这样我的业务备份数据就不会与我的个人 Google 帐户内容混在一起。

    我们将 Google 帐户名称称为<google_account_name>。

    第 2 步:设置数据库转储

    为此,我们将为数据库转储创建一个特殊目录,并使用该mysqldump命令。

    创建一个备份目录并给自己必要的权限

    我的 Ubuntu 发行版带有一个backup用户和组以及一个var/backups目录,那么为什么不使用这些呢?

    使组backup所有者/var/backups:

    sudo chgrp backup /var/backups

    授予backup组对该目录的读写权限:

    sudo chmod g+rw /var/backups

    将您自己的帐户添加到backup组中:

    sudo usermod -aG backup <username>

    这将使您更容易访问备份目录的内容。

    您可能需要注销然后重新登录才能使新的组成员身份生效。要检查您的组成员身份,请使用命令groups。

    创建用于执行备份的特殊 SQL 用户帐户

    通过命令行登录 MySQL:

    mysql -u root -p

    创建一个新的数据库用户帐户

    我们不想通过给予比我们绝对必须更多的权限来使自己变得脆弱。因此,我们将创建一个具有只读权限的新数据库用户帐户。为了保持一致,我打电话给这个用户backup。为 .选择一个非常强大的密码<db_password>。

    CREATE USER 'backup'@'localhost' IDENTIFIED BY '<db_password>'

    授予只读权限:

    GRANT SELECT,EVENT,TRIGGER,SHOW DATABASES ON *.* TO 'backup'@'localhost';

    设置数据库备份命令:

    测试转储命令(替换<db_password>为您之前为新 MySQL 用户设置的密码):

    mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<db_password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
    

    此命令会将所有数据库转储到单个文件中,并标有年份和当前周数。每次我们运行它时,它都会更新当前的转储文件。但是,当新的一周开始时,它将最终创建一个新文件。因此,我们维护了我们数据库每周快照的历史记录。您可以调整日期部分以增加或减少这些快照的频率,具体取决于数据库的大小和您愿意为这些快照捐赠的空间。

    第 3 步:安装 Duplicity 的依赖项

    我们需要以下库的最新版本才能使用最新版本的 Duplicity:

    • popt
    • libbz2
    • librsync

    运行以下命令:

    sudo apt-get install libpopt-dev libpopt0
    sudo apt-get install libbz2-dev
    
    cd ~
    wget https://github.com/librsync/librsync/archive/v2.0.0.tar.gz
    tar xzvf v2.0.0.tar.gz -C librsync
    cd librsync
    sudo cmake .
    sudo make all check
    sudo make && sudo make install
    

    更新重复

    截至 2016 年 10 月 6 日的当前稳定版本为 0.7.10。

    cd ~
    wget https://code.launchpad.net/duplicity/0.7-series/0.7.10/+download/duplicity-0.7.10.tar.gz
    tar xzvf duplicity*
    cd duplicity*
    sudo python setup.py install
    

    设置一个定义LD_LIBRARY_PATH(参见如何在 Ubuntu 中设置 $LD_LIBRARY_PATH?):

    Duplicity 需要这个环境变量,以便它可以找到librsync之前安装的共享库对象。

    sudo nano /etc/ld.so.conf.d/librsync.so.2.conf

    librsync.so.2.conf:

    /usr/local/lib
    

    您现在必须重新加载 Ubuntu 的 ldconfig 缓存:

    sudo ldconfig

    安装 PyDrive

    这是处理 Duplicity 和 Google Drive API 之间的 OAuth2 协商的库。

    pip install pydrive

    第 4 步:通过 OAuth2 设置 Google Drive 身份验证

    创建 API 凭据

    通过 Google 的开发者控制台执行此操作。看:

    • https://stackoverflow.com/questions/31370102/how-do-i-backup-to-google-drive-using-duplicity
    • http://6ftdan.com/danielpclark/2016/04/21/encrypted-linux-backup-with-google-drive-and-duplicity/

    创建配置文件:

    PyDrive使用此文件来存储 Google API 的凭据和配置设置。

    nano /home/<username>/.duplicity/credentials

    client_config_backend: settings  
    client_config:  
       client_id: <your client ID>.apps.googleusercontent.com
       client_secret: <your client secret>
    save_credentials: True
    save_credentials_backend: file
    save_credentials_file: /home/<username>/.duplicity/gdrive.cache
    get_refresh_token: True
    

    设置GOOGLE_DRIVE_SETTINGS环境变量:

    export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials

    我还建议添加GOOGLE_DRIVE_SETTINGS到sudo 环境变量:

    sudo visudo

    在末尾添加以下行:

    Defaults env_keep += "GOOGLE_DRIVE_SETTINGS"

    第 5 步:测试未加密的虚假备份

    (参考:https ://www.digitalocean.com/community/tutorials/how-to-use-duplicity-with-gpg-to-securely-automate-backups-on-ubuntu )

    我们将创建一些测试文件,只是为了检查我们是否可以使用 Duplicity 成功地将它们传输到 Google Drive。

    创建测试文件:

    cd ~
    mkdir test
    touch test/file{1..100}
    

    运行重复性:

    duplicity ~/test gdocs://<google_account_name>@gmail.com/backup

    按照它创建的验证链接,将收到的验证码复制粘贴回提示中。Duplicity应该存储它创建的身份验证令牌,/home/<username>/.duplicity/gdrive.cache这样我们就不必再次执行验证步骤(因此我们的系统可以在没有我们输入的情况下每晚自动执行此操作)。

    第 6 步:创建 GPG 密钥

    在将备份数据发送到 Google Drive 之前,您需要GPG的密钥来加密您的备份数据。要生成密钥,只需运行以下命令:

    gpg --gen-key

    按照它提供的说明进行操作,并确保您选择了一个好的密码。如果遇到关于“熵不足”的消息,您可以尝试运行sudo apt-get install rng-tools. 安装本身应该生成足够的熵,GPG 可以生成真正的随机密钥。请参阅https://stackoverflow.com/a/12716881/2970321。

    完成后将显示 GPG“指纹”。您将需要此指纹中的主公钥 ID。/这只是以开头的行之后的 8 位十六进制代码pub。请参阅https://security.stackexchange.com/a/110146/74909。

    将您为 GPG 密钥设置的密码添加到机密文件:

    sudo nano /root/.passphrase
    sudo chmod 700 /root/.passphrase
    

    .密码:

    PASSPHRASE="my passphrase"
    

    备份您的 GPG 密钥:

    如果您丢失了 GPG 密钥,您的加密备份将变得毫无用处。因此,您应该将 GPG 密钥备份到 VPS 以外的某个地方。

    例如,要备份到本地计算机:

    gpg --list-keys
    gpg -ao ~/gpg-public.key --export <gpg_public_key_id>
    
    gpg --list-secret-keys
    gpg -ao ~/gpg-private.key --export-secret-keys <gpg_private_key_id>
    

    然后在您的本地机器上:

    scp <username>@<vps_host>:~/gpg-public.key ~/gpg-public.key
    scp <username>@<vps_host>:~/gpg-private.key ~/gpg-private.key
    

    看:

    https://help.ubuntu.com/community/GnuPrivacyGuardHowto#Backing_up_and_restoring_your_keypair

    根据数据的性质,您可能需要考虑将 GPG 密钥的私有部分放在一张纸上,然后将该纸存放在保险箱中。

    步骤 7:测试 SQL 转储的加密备份

    duplicity --encrypt-key <gpg_public_key_id> --exclude="**" --include="/var/backups/sql" / gdocs://<google_account_name>@gmail.com/backup
    

    第 8 步:将数据库转储和 Duplicity 命令一起放入cron脚本中

    设置每日增量备份

    这将每晚运行,创建增量备份。Duplicity 默认情况下会尝试备份磁盘上的所有文件,这在 VPS 上可能不想要。因此,我们使用该--exclude参数,以便它忽略除我们包含的目录之外的所有内容 via --include。您可以使用多个--include参数来包含多个目录。

    sudo nano /etc/cron.daily/duplicity.inc

    重复性.inc:

    #!/bin/sh
    
    test -x $(which duplicity) || exit 0
    . /root/.passphrase
    
    export PASSPHRASE
    export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
    # This lets the script find your GPG keys when it is running as root
    export GNUPGHOME=/home/<username>/.gnupg
    
    # Run MySQL dump.  This will create a weekly file, and then update the file every additional time this script is run
    mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
    
    # Performs an incremental backup by default.  Since we create a new dump file every week, we have a history
    # of weekly snapshots, and the current week is incrementally updated each day.
    duplicity --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup
    

    设置权限:

    chmod 755 /etc/cron.daily/duplicity.inc

    设置每周完整备份

    这将每周运行一次,创建一个完整备份并清除除最后三个完整备份之外的所有备份以节省空间。同样,您可以根据您的情况调整此频率和要保留的备份数量。

    sudo nano /etc/cron.weekly/duplicity.full

    duplicity.full:

    #!/bin/sh
    
    test -x $(which duplicity) || exit 0
    . /root/.passphrase
    
    export PASSPHRASE
    export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
    # This lets the script find your GPG keys when it is running as root
    export GNUPGHOME=/home/<username>/.gnupg
    
    # Run MySQL dump.  This will create a weekly file, and then update the file every additional time this script is run
    mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
    
    # Create a brand new full backup, which contains all the weekly dumps located in /var/backups/sql
    duplicity full --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup
    
    # Clean out old full backups
    duplicity remove-all-but-n-full 3 --force gdocs://<google_account_name>@gmail.com/backup
    

    设置权限:

    chmod 755 /etc/cron.weekly/duplicity.full

    如果您在这些cron.*目录中的任务由于某种原因没有自动运行(通常是由于权限问题),您可以将这些任务添加到根 cron 文件中:

    sudo crontab -e

    添加行(尝试选择奇数时间):

    # Incremental backup every day at HH:MM
    MM HH * * * /etc/cron.daily/duplicity.inc >> /var/log/backups.log 2>&1
    # Full backup every Saturday at HH:MM
    MM HH * * 6 /etc/cron.weekly/duplicity.full >> /var/log/backups.log 2>&1
    

    保存并退出。

    步骤 9:测试和验证备份

    您可以尝试将您的备份从 Google Drive 下载回~/test:

    sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test

    • 9

相关问题

  • 总大小(磁盘)与总大小(媒体)

  • 社区对备份解决方案的意见

  • 无法读取不同 LTO-3 驱动器上的 LTO-3 磁带

  • 使用 TSM 备份时跳过硬链接

  • 使用 rsync 维护名称更改的目录的副本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve