Select Page

資料庫-每日自動備份-Ubuntu-MariaDB

今天來實做一個備份任務,要在 Ubuntu 上設定每日凌晨 4:00 自動備份 MariaDB 中的所有資料庫,我們可以使用 cron 和一個自定義的 Shell 腳本來完成這個任務,以下是詳細步驟和代碼:

步驟 1:創建備份腳本

先創建一個備份 Shell Script,這個腳本將備份所有資料庫並分開儲存。

1.在 /usr/local/bin 目錄下創建一個新的 Shell 腳本:

    sudo nano /usr/local/bin/backup_mariadb.sh

    2. Script 的內容指令如下

    #!/bin/bash
    
    # 設定資料庫的用戶名和密碼
    DB_USER="your_db_user"
    DB_PASSWORD="your_db_password"
    DB_HOST="10.0.0.1"
    
    # 設定備份儲存目錄
    BACKUP_DIR="/path/to/backup/dir"
    mkdir -p $BACKUP_DIR
    
    # 獲取當前日期和時間
    CURRENT_DATE=$(date +%Y-%m-%d-%H-%M-%S)
    
    # 獲取所有資料庫名稱
    DATABASES=$(mysql -h$DB_HOST -u$DB_USER -p$DB_PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
    
    # 備份每個資料庫
    for DB in $DATABASES; do
      if [[ "$DB" != "information_schema" && "$DB" != "performance_schema" && "$DB" != "mysql" && "$DB" != "sys" ]]; then
        BACKUP_FILE="$BACKUP_DIR/$CURRENT_DATE-$DB.sql"
        mysqldump  -h$DB_HOST -u$DB_USER -p$DB_PASSWORD --databases $DB > $BACKUP_FILE
      fi
    done

    其中要修改的有

    • DB_HOST : 要改成自己的
    • your_db_user : 資料庫中有備份權限的使用者 ID
    • your_db_password : 密碼
    • BACKUP_DIR=”/path/to/backup/dir” : 要改成你要存放的路徑,像是 /var/backup_db/

    3.將 .sh 變成可執行擋

    sudo chmod +x /usr/local/bin/backup_mariadb.sh

    步驟 2:設置 Cron 任務

    1.打開 cron

    crontab -e

    2.加入設定內容,要注意的是實間是主機時間,通常主機是 UTC+0 的時區,要注意轉換,才會是正確的當地時間,可以參考這篇

    0 4 * * * /usr/local/bin/backup_mariadb.sh

    這樣就會在每天的早上四點去備份資料庫了

    加入每一個SQL檔案都可以被壓縮的功能

    程式碼區塊要改成下面這一個

    # 備份每個資料庫並壓縮
    for DB in $DATABASES; do
      if [[ "$DB" != "information_schema" && "$DB" != "performance_schema" && "$DB" != "mysql" && "$DB" != "sys" ]]; then
        BACKUP_FILE="$BACKUP_DIR/$CURRENT_DATE-$DB.sql"
        ZIP_FILE="$BACKUP_DIR/$CURRENT_DATE-$DB.zip"
        mysqldump -h$DB_HOST -u$DB_USER -p$DB_PASSWORD --databases $DB > $BACKUP_FILE
        zip $ZIP_FILE $BACKUP_FILE
        rm $BACKUP_FILE
      fi
    done

    刪除舊資料

    可以利用下面的指令,放在程式碼的最後面

    # 刪除兩天前的備份文件
    find $BACKUP_DIR -type f -name "*.zip" -mtime +2 -exec rm {} \;

    需要改時間的話,只要修正 -mtime +2 ,把+2改成自己需要的時間

    參考資料

    https://help.ubuntu.com/community/CronHowto

    MySQL, MariaDB, 整個資料庫的複製方法

    如果你想一次複製所有的資料,包括用戶數據和結構,你可以使用以下方法:

    1.使用 mysqldump 進行完整備份:

    mysqldump 可以用來備份整個 MariaDB 數據庫,包括資料表結構和數據。以下是備份和還原的步驟:

    首先到原始主機上

    mysqldump -u root -p --all-databases > full_backup.sql

    這時候你會取得 full_backup.sql 檔案,將此檔案複製到目標主機上頭

    並且到目標主機上做還原的動作

    mysql -u root -p < full_backup.sql

    2.用外部程式直接複製 MariaDB 資料庫

    可以用 Percona XtraBackup , 安裝方法可以看 https://docs.percona.com/percona-xtradb-cluster/8.0/apt.html#prerequisites

    備份指令如下:

    innobackupex --user=root --password=your_password /path/to/backup_directory

    還原指令如下

    innobackupex --copy-back /path/to/backup_directory

    3.複製用戶資訊

    備份以及還原完資料後,要記得把用戶資料也都一起複製過來,首先用 root 或是管理員等級的帳號登入,並且下面的執行指令,把用戶資訊匯出

    mysqldump -u root -pYourPassword -R --databases mysql > user_backup.sql

    注意 -p 後面直接跟著密碼,中間不能有空格。

    還原用戶資訊

    SOURCE /path/to/user_backup.sql;

    結論

    這將在新主機上創建與原始主機相同的用戶帳號、密碼和許可權,以及把之前的所有資料複製到新主機上面。請確保新主機上的 MariaDB 版本與原始主機上的版本相容,並且新主機的網絡設置和防火牆規則允許用戶連接。

    參考資訊

    Windows 設定 MariaDB Master to Master 備援:全面指南

    Windows 設定 MariaDB Master to Master 備援:全面指南

    1. 瞭解 MariaDB Master to Master 備援的重要性

    Master to Master (M2M) 備援在 MariaDB 中是非常重要的一種設定。它允許兩個 MariaDB 伺服器雙向地同步資料,確保其中一台伺服器發生問題時,另一台可以立即接手,確保資料的持續可用性。對於那些尋求高可用性和資料完整性的應用程式來說,這是一個非常有用的設定。

    2. Windows 環境下的 MariaDB 安裝步驟

    要在 Windows 上設定 M2M,首先需要正確地安裝 MariaDB。下載適用於 Windows 的 MariaDB 版本並執行安裝程式。選擇適當的安裝選項,例如伺服器位置、資料庫大小等。並且確保在安裝過程中設定一個強大的 root 密碼,以確保資料庫的安全。

    Windows MariaDB Server Download

    目前MariaDB長期支援版本為 MariaDB 10.11 版本,11版本則是有最佳化過的,兩者都可以用,可以依照自己的需求做選擇

    假設兩台主機如下

    • Hostname: Master01 ,IP:192.168.0.10
    • Hostname: Master02 ,IP:192.168.0.11

    3. 配置 Master to Master 備援

    設定 M2M 備援涉及許多步驟:

    修改 my.ini(Windows) 或 my.cnf(Linux) 設定檔,設定 server-id 和 log-bin 參數

    可以在開始功能表中找到my.ini,或是到你安裝時候填寫的資料庫路徑中可以看到my.ini檔案

    每個 master 伺服器應該有一個唯一的 server-id,所以要在my.ini設定檔案中加入 server-id、log-bin、log-basename

    第一台主機 id 設定為 1

    [mysqld]
    datadir=C:/Mariadb
    port=3306
    innodb_buffer_pool_size=2559M
    character-set-server=utf8mb4
    
    server-id = 1
    log-bin
    log-basename = master01

    第二台主機 id 設定為 2

    [mysqld]
    datadir=C:/Mariadb
    port=3306
    innodb_buffer_pool_size=2559M
    character-set-server=utf8mb4
    
    server-id = 2
    log-bin
    log-basename = master02

    在每台伺服器上建立用於備援的使用者帳號,並授予該使用者適當的權限。

    在第一台主機 master01 上,新增一個使用者,讓 slave 主機可以透過192.168.0.X的網段連進來

    grant replication slave on *.* to 'replica_user'@192.168.0.% identified by '123456';
    flush privileges;

    在第二台主機 master02 上,新增一個使用者,並且要讓 master01 主機的 IP 可以連進來

    grant replication slave on *.* to 'replica_user'@192.168.0.% identified by '123456';
    flush privileges;

    設定 replication filters,確保只有需要的資料被同步。

    啟動二進制日誌(binary logging)並確認每台伺服器都可以互相連接。

    4. 測試 Master to Master 備援

    在完成設定後,你應該測試 M2M 備援以確保它正常工作。首先,在一台伺服器上添加或修改一些資料,然後檢查另一台伺服器是否已同步這些變更。同樣地,從另一台伺服器修改資料並檢查第一台伺服器。此過程應確保資料在兩個伺服器之間正確同步。

    在 Master01 中,查詢 File 和 Position,並且把值記錄下來,等等要填到 master02

    show master status;

    在 master02 中,把 master01 的數值填入,並且建立連結

    change master to master_host='192.168.0.10',
        -> master_user='replica_user',
        -> master_password='123456',
        -> master_log_file='master01-bin.000001',
        -> master_log_pos=5099;
    
    start slave;

    接下來檢查是否有設定成功

    show slave status;

    接下來回到 master01 去設定跟 master02 的連接

    change master to master_host='192.168.0.11',
        -> master_user='replica_user',
        -> master_password='123456',
        -> master_log_file='master02-bin.000002',
        -> master_log_pos=5079;
    
    start slave;

    5. 維護和監控 Master to Master 備援

    一旦 M2M 備援設定完畢並經過測試,你需要持續監控以確保它正常運作。使用如 MariaDB 的 SHOW SLAVE STATUS 命令來檢查備援的狀態。此外,考慮使用監控工具,如 Nagios 或 Zabbix,來自動檢查伺服器的健康狀態。

    相關文章

    如何在 Ubuntu 20.04 上安裝 PHP 8.0、Nginx、MariaDB、WordPress CMS

    如何在 Ubuntu 20.04 上安裝 PHP 8.0、Nginx、MariaDB、WordPress CMS

    sudo apt update -y
    sudo apt upgrade -y

    安裝 Nginx

    sudo apt install nginx -y

    想要支援 fastcgi_cache purge module 的話,請改用下面的方法安裝 nginx

    sudo add-apt-repository ppa:rtcamp/nginx
    sudo apt-get update
    sudo apt-get remove nginx*
    sudo apt-get install nginx-full

    可以用下面的指令,確認是否有安裝 fastcgi cache purge module

    nginx -V 2>&1 | grep nginx-cache-purge -o

    安裝完畢後可以啟用 nginx

    sudo systemctl start nginx
    sudo systemctl enable nginx

    如果有啟用防火牆,記得要開啟相對應的PORT

    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw reload

    驗證以及測試一下是否正常


    安裝以及設定 MariaDB

    接下來可以安裝資料庫MariaDB

    sudo apt install mariadb-server
    sudo systemctl status mariadb

    保護好你的資料庫,修改 root 密碼,以及移除用不到的帳戶以及資料表,和防止 root 遠端登入

    sudo mysql_secure_installation

    啟動 MariaDB Service

    sudo systemctl start mariadb
    sudo systemctl enable mariadb

    為資料庫建立一個專用使用者,用來操作 wordpress db

    sudo mysql -u root -p
    MariaDB [(none)]> CREATE USER 'wordpressdbuser'@'localhost' IDENTIFIED BY 'password';

    建立一個資料庫,以及一個資料庫的使用者(USER),要給 wordpress 系統使用的

    sudo mysql -u root -p
    MariaDB [(none)]> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wordpressdbuser'@'localhost' IDENTIFIED BY 'password';
    MariaDB [(none)]> FLUSH PRIVILEGES;

    設定完畢後退出 MariaDB 的介面


    安裝 PHP 8.0

    因為 php 8 較新,還沒包含在標準套件中,所以我們要新增 PHP 8 的軟體包

    sudo apt install software-properties-common
    sudo add-apt-repository ppa:ondrej/php
    sudo apt update
    sudo apt upgrade

    新增了PPA後,我們可以直接下指令安裝 PHP 8.0

    sudo apt install php8.0

    驗證是否安裝正確

    php -v

    預設 php8.0 安裝完畢後會是支援 apache ,我們需要在安裝 PHP 8 FPM 讓他可以支援 Nginx

    sudo apt install php8.0-fpm

    安裝常用的 PHP 8.0 擴充套件,可以依照情況刪減

    sudo apt install php8.0-common php8.0-mysql php8.0-xml php8.0-curl php8.0-gd php8.0-imagick php8.0-cli php8.0-dev php8.0-imap php8.0-mbstring php8.0-opcache php8.0-soap php8.0-zip -y

    為 Nginx 設定 PHP 8

    sudo nano /etc/php/8.0/fpm/php.ini

    可以修改下列的預設數值,讓 PHP 可以運行得更好

    upload_max_filesize = 32M 
    post_max_size = 48M 
    memory_limit = 256M 
    max_execution_time = 600 
    max_input_vars = 3000 
    max_input_time = 1000

    修改完畢後存檔,並且重啟 PHP 8

    sudo php-fpm8.0 -t 
    sudo service php8.0-fpm restart

    2023-11 更新,官方推薦也可以安裝 8.2 版本

    #安裝php8.2-fpm
    sudo apt-get install php8.2-fpm -y
    #安裝php8.2套件
    sudo apt install php8.2-common php8.2-mysql php8.2-xml php8.2-curl php8.2-gd php8.2-imagick php8.2-cli php8.2-dev php8.2-imap php8.2-mbstring php8.2-opcache php8.2-soap php8.2-zip -y
    #檢查PHP版本
    php -v

    安裝 wordpress

    先下載wordpress,我安裝的版本是中文正體 wordpress 5.8.1,下載完畢後,解壓縮,並且放到你想要放的目錄下,本例是 /var/www/mysite

    wget -c https://tw.wordpress.org/latest-zh_TW.zip
    unzip latest-zh_TW.zip
    sudo cp -R ./wordpress/* /var/www/mysite/

    剛複製過去的權限會是 root 的權限,接下來用指令設置權限為 www-data

    sudo chown -R www-data:www-data /var/www/mysite
    sudo chmod -R 775 /var/www/mysite

    在 Nginx 中建立 WordPress 的虛擬伺服器 (VirtualHost)

    先刪除 Nginx 中的預設檔,然後建立一個自己的設定檔(.conf)

    sudo rm /etc/nginx/sites-enabled/default
    sudo rm /etc/nginx/sites-available/default
    sudo nano /etc/nginx/conf.d/mysite.conf

    mysite.conf 內容如下,mysite 的資訊要換成你自己的伺服器資訊

    server {
            listen 80;
            listen [::]:80;
            root /var/www/mysite.com;
            index  index.php index.html index.htm;
            server_name mysite.com www.mysite.com;
    
            error_log /var/log/nginx/mysite.com_error.log;
            access_log /var/log/nginx/mysite.com_access.log;
            
            client_max_body_size 100M;
            location / {
                    try_files $uri $uri/ /index.php?$args;
            }
            location ~ \.php$ {
                    include snippets/fastcgi-php.conf;
                    fastcgi_pass unix:/run/php/php8.0-fpm.sock;
                    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }
    }

    如果你是把 config 檔按放在 /etc/nginx/sites-available/ 下的話,要記得 ln (軟連結) config

    sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf

    測試 Nginx ,成功的話就重啟伺服器

    sudo nginx -t
    sudo service nginx restart

    透過瀏覽器安裝 WordPress

    開啟瀏覽器,並且輸入 https://localhost/ 可以在本地端安裝 WordPress 系統

    開始安裝WordPress
    設定 WordPress 的資料庫資訊
    設定要登入 WordPress 的帳號密碼
    之後就大功告成了

    多網站連結

    可以使用另外建立一個 a config檔案,並且利用ln指令做連結

    cd /etc/nginx/sites-enable/
    sudo ln -s /etc/nginx/sites-available/a

    參考資料:

    https://tw511.com/a/01/23398.html

    https://cn.linux-console.net/?p=1601