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

    Linux find 指令介紹(尋找檔案、目錄)

    Linux 的 find 指令是一個非常強大而且必定要學習的工具,用於在文件系統中搜索符合特定條件的文件或目錄。以下想要介紹這個指令,通過各種參數和選項來定制搜索條件,讓你能夠精確地找到所需的文件。

    基本語法

    find 指令的基本語法如下:

    find [路徑...] [選項] [動作]
    • 路徑:指定 find 指令開始搜索的目錄。如果不指定,默認為當前目錄。
    • 選項:定義搜索的條件,例如按文件名、文件類型、修改時間等。
    • 動作:對搜索結果執行的操作,如列印文件名、刪除文件等。如果不指定動作,默認動作是列印所有找到的文件的路徑。

    常用選項

    1. 按名稱搜索
      • -name 'pattern':搜索文件名匹配指定的模式的文件。模式可以包含通配符,如 *?
      • 示例:find /home/user -name '*.txt'
    2. 按類型搜索
      • -type f:僅搜索文件。
      • -type d:僅搜索目錄。
      • 示例:find /var/log -type f
    3. 按修改時間搜索
      • -mtime +n:搜索在 n 天之前被修改過的文件。
      • -mtime -n:搜索在最近 n 天內被修改過的文件。
      • 示例:find / -mtime -10
    4. 按大小搜索
      • -size +n:搜索大於 n 單位的文件。單位可以是 k(KB)、M(MB)、G(GB)。
      • -size -n:搜索小於指定大小的文件。
      • 示例:find / -size +100M

    常用動作

    • -print:輸出匹配文件的完整路徑(這是默認動作)。
    • -delete:刪除找到的文件。
    • -exec cmd {} \;:對找到的每個文件執行指定的命令。{} 是一個占位符,代表當前找到的文件名。
    • 示例:find /tmp -type f -mtime +30 -exec rm {} \;

    最常使用的動作

    搜尋整個硬碟中大於100MB的log檔案(不分大小寫),並且把她刪除

    find / -type f -size +100M -iname "*.log" -delete

    使用案例

    尋找並刪除 30 天前的臨時文件

    find /tmp -type f -mtime +30 -delete

    尋找特定大小的日誌文件並列出詳細信息

    find /var/log -type f -size +50M -exec ls -lh {} \;

    尋找所有 JPG 文件並複製到另一個目錄

    find /home/user/Pictures -name '*.jpg' -exec cp {} /home/user/Backup/ \;

    find 完整參數

    • -mtime : 搜尋檔案的修改時間(天)
    • -mmin : 搜尋檔案的修改時間(分鐘)
    • -ctime : 搜尋檔案的建立時間(天)
    • -cmin : 搜尋檔案的建立時間(分鐘)
    • -atime : 搜尋檔案的最後開啟時間(天)
    • -amin : 搜尋檔案的最後開啟時間(分鐘)
    • -size : 搜尋檔案的大小
    • -name : 搜尋檔案名稱(有分大小寫)
    • -iname : 搜尋檔案名稱(不分大小寫)
    • -type f : 只搜尋“檔案”
    • -type d : 只搜尋“目錄”
    • -exec <cmd> {} \; : 把搜尋結果導向指令來執行
    • -user : 搜尋特定使用者的檔案或目錄
    • -o : 邏輯運算為「或」的意思
    • -print : 將結果印出於螢幕

    參考資料

    https://www.redhat.com/sysadmin/linux-find-command

    手把手教學安裝 anything-llm (不使用 docker)

    手把手教學安裝 anything-llm (不使用 docker)

    AnythingLLM是一款全功能的應用程序,支持使用商業或開源的大語言模型(LLM)和向量數據庫建構私有ChatGPT。用戶可以在本地或遠端運行該系統,並利用已有文檔進行智能對話。此應用將文檔分類至稱為工作區的容器中,確保不同工作區間的資料隔離,保持清晰的上下文管理。

    特點:多用戶支持、權限管理、內置智能代理(可執行網頁瀏覽、代碼運行等功能)、可嵌入到網站的聊天窗口、多種文檔格式支持、向量數據庫的簡易管理界面、聊天和查詢兩種對話模式、引用文檔內容的展示,以及完善的API支持客戶端定制整合。此外,該系統支持100%雲端部署,Docker部署,且在處理超大文檔時效率高,成本低。

    安裝 Anything llm

    注意,以下要用 linux 平台安裝,windows 用戶可以用 WSL,推薦用 Ubuntu OS

    在自己的 home 目錄下,到 GitHub 中下載原始碼

    git clone https://github.com/Mintplex-Labs/anything-llm.git

    利用 yarn 作設定資源

    cd anything-llm
    yarn setup

    把環境變數建立起來,後端主機是 NodeJS express

    cp server/.env.example server/.env
    nano server/.env

    密文需要最少12位的字元,檔案的存放路徑也記得改成自己的

    JWT_SECRET="my-random-string-for-seeding"
    STORAGE_DIR="/your/absolute/path/to/server/storage"

    前端的環境變數,先把/api打開即可

    # VITE_API_BASE='http://localhost:3001/api' # Use this URL when developing locally
    # VITE_API_BASE="https://$CODESPACE_NAME-3001.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN/api" # for Github Codespaces
    VITE_API_BASE='/api' # Use this URL deploying on non-localhost address OR in docker.

    如果你在設定的時候,遇到更新請求,可以跟我著我下面的方法作

    把 prisma 更新好

    yarn add --dev prisma@latest
    yarn add @prisma/client@latest

    前端的程式碼

    先編譯前端程式碼,前端是由 viteJS + React

    cd frontend && yarn build

    將編譯好的資料放到 server 的目錄下

    cp -R frontend/dist/* server/public/

    選項,如果需要用到本地端的 LLM 模型,就把 llama-cpp 下載下來

    cd server && npx --no node-llama-cpp download

    把資料庫建立好

    cd server && npx prisma generate --schema=./prisma/schema.prisma
    cd server && npx prisma migrate deploy --schema=./prisma/schema.prisma

    Server端是用來處理 api 以及進行向量資料庫的管理以及跟 LLM 交互

    Collector 是一個 NodeJS express server,用來作UI處理和解析文檔

    cd server && NODE_ENV=production node index.js &
    cd collector && NODE_ENV=production node index.js &

    更新的指令碼

    現在 anything llm 更新速度超快,把這一段指令碼複製起來,方便未來作更新的動作

    #!/bin/bash
    
    cd $HOME/anything-llm &&\
    git checkout . &&\
    git pull origin master &&\
    echo "HEAD pulled to commit $(git log -1 --pretty=format:"%h" | tail -n 1)"
    
    echo "Freezing current ENVs"
    curl -I "http://localhost:3001/api/env-dump" | head -n 1|cut -d$' ' -f2
    
    echo "Rebuilding Frontend"
    cd $HOME/anything-llm/frontend && yarn && yarn build && cd $HOME/anything-llm
    
    echo "Copying to Sever Public"
    rm -rf server/public
    cp -r frontend/dist server/public
    
    echo "Killing node processes"
    pkill node
    
    echo "Installing collector dependencies"
    cd $HOME/anything-llm/collector && yarn
    
    echo "Installing server dependencies & running migrations"
    cd $HOME/anything-llm/server && yarn
    cd $HOME/anything-llm/server && npx prisma migrate deploy --schema=./prisma/schema.prisma
    cd $HOME/anything-llm/server && npx prisma generate
    
    echo "Booting up services."
    truncate -s 0 /logs/server.log # Or any other log file location.
    truncate -s 0 /logs/collector.log
    
    cd $HOME/anything-llm/server
    (NODE_ENV=production node index.js) &> /logs/server.log &
    
    cd $HOME/anything-llm/collector
    (NODE_ENV=production node index.js) &> /logs/collector.log &
    如何變動在 linux 中的預設 php 執行檔?

    如何變動在 linux 中的預設 php 執行檔?

    在 Linux 中更改命令行的預設 PHP 執行檔,通常涉及更新系統的 PATH 環境變數或使用 update-alternatives 工具(如果你的系統支援)。以下是幾種常見的方法來變更預設 PHP 執行檔:

    方法 1:使用 update-alternatives(適用於 Debian、Ubuntu 及其衍生系統)

    如果你的系統安裝了多個 PHP 版本,可以使用 update-alternatives 工具來設定預設的 PHP 版本。

    列出所有可用的 PHP 替代版本

    sudo update-alternatives --display php

    設定預設 PHP 版本

    使用下面的命令設定預設版本。將 phpX.Y 替換成你想設定為預設的 PHP 版本號,例如 php8.2

    sudo update-alternatives --set php /usr/bin/php8.2

    如果你想要在可用選項之間手動選擇,可以使用:

    sudo update-alternatives --config php

    方法 2:直接修改 PATH 環境變數

    你可以通過修改 PATH 環境變數來讓系統首先找到你想要的 PHP 版本。這可以通過在你的 ~/.bashrc~/.zshrc 或其他適用的 shell 配置檔案中添加一行來實現。

    假設你想使用的 PHP 版本位於 /usr/local/phpX.Y/bin(將 X.Y 替換成具體版本號),可以添加以下行:

    export PATH=/usr/local/phpX.Y/bin:$PATH

    然後,執行 source ~/.bashrc(或對應的配置檔案)來使變更生效。

    source ~/.bashrc

    方法 3:使用符號連結

    另一個變更預設 PHP 執行檔的方法是建立一個指向你想要的 PHP 版本的符號連結(symlink)。這通常涉及到刪除或重命名舊的 PHP 符號連結,然後創建一個新的指向你選擇的版本。

    刪除或重命名當前的符號連結

    sudo mv /usr/bin/php /usr/bin/php.old

    建立新的符號連結

    /usr/bin/php 指向你想要的 PHP 版本。將 /path/to/your/php 替換成你想要設定為預設 PHP 執行檔的完整路徑。

    sudo ln -s /path/to/your/php /usr/bin/php

    在進行這些變更後,你可以通過執行 php -v 來驗證新的預設 PHP 版本是否已正確設定。

    php -v
    如何定時打開和關閉 GCP VM Nginx WEB 達到省錢目的

    如何定時打開和關閉 GCP VM Nginx WEB 達到省錢目的

    建立一個會自動開機和關閉虛擬機器的排程

    值得注意的事項:

    • 主機時間都是 UTC 時間,設定的時候,要記得處理這邊,例如台灣時區是+8,所以設定時間的時候要-8

    1.首先設定一個 Compute Engine 的 「執行個體排程」如圖所示

    2.建立一個新的執行個體排程

    設定在每天18:00到23:00最忙碌的時候多開一台主機

    3.將要執行的 VM 個體加入到此排程中

    記得建立好排程後,要把適用這個規則的 VM 個體都加入,GCP 的排程才會去處理 VM 的開關

    4.執行排程的權限設定

    如果你之前沒做過權限設定,那肯定會遇到權限不足的錯誤訊息,這時候要來到 IAM 與管理 -> 身分與存取權管理,並且先勾選「包含 Google 提供的角色授權」,然後選擇「授予存取權」

    然後主體要選擇你自己的 compute-system.iam 指派角色則是選擇 Compute 執行個體管理員(v1),如圖所示

    建立 Ubuntu or Debian 的 Shell Script 定時執行開關機

    1.建立自動開關設定的 Script

    #!/bin/bash
    
    SOURCE_CONF="/path/to/a.conf"
    TARGET_CONF="/path/to/nginx/nginx.conf"
    
    # 使用 sudo 執行需要 root 權限的命令
    sudo cp "$SOURCE_CONF" "$TARGET_CONF"
    sudo nginx -s reload

    2.可以使用 crontab 命令來檢查和管理定時任務(cron jobs)

    sudo crontab -e

    加入執行時間、程式碼等設定

    # 分 鐘 小時 日期 月份 星期 命令
    0 23 * * * /path/to/update_nginx_conf.sh

    這樣就可以利用 root 權限運行 Script

    其中:

    • 分鐘:分鐘(0-59)
    • 小時:小時(0-23,採24小時制)
    • 日期:一個月中的某天(1-31)
    • 月份:月份(1-12)
    • 星期:星期幾(0-7,其中0和7都代表星期日)
    • 命令:要執行的命令或腳本的絕對路徑

    例如,如果您希望每天凌晨 3 點執行一個名為 script.sh 的腳本,您應該這樣寫:

    檢查

    檢查 crontab 列表:輸入 crontab -l 來確認您的任務已被添加到 crontab 列表中。

    其他方法

    at 指令

    例如要讓指令碼在明天的 10:00執行,可以執行下面的指令

    at 10:00 AM tomorrow /path/to/script.sh

    systemd (System and Service Manager)

    1. 創建一個 systemd 定時任務檔案。
    2. 在定時任務檔案中指定要執行的命令或腳本以及執行時間。
    3. 啟用定時任務。

    例如:每一分鐘都要執行一次 script.sh

    [Unit]
    Description=My Script
    
    [Timer]
    OnCalendar=*-*-* *:* *
    
    [Service]
    ExecStart=/path/to/script.sh

    錯誤處理

    如果有遇到無法執行權限的話,可以參考下面的文章解決權限問題

    結語

    這樣設定完成後,GCP自己就會在晚上11點關機、晚上6點開機,而我的腳本則是在晚上11:00 關閉 Nginx 的 upstream,在18:15開啟 upstream server