分類
程序

使用xtrabackup備份mysql數據庫

本文主要記錄下使用percona xtrabackup 2.4來備份mysql數據。最終效果是實現mysql所在主機定時進行全量備份和增量備份並自動刪除舊備份文件。另有一台數據存儲機,定時通過ssh抓取各個mysql主機上的備份文件,保存更長時間後刪除舊文件。

用到的軟件和技術有:xtrabackup(免費的mysql備份程序),qpress(xtrabackup壓縮需要的依賴,據說壓縮比很高),python3.5(ssh的遠程抓取,因為我不會bash)。

mkdir -p /root/42/script
cd /root/42/script
#安裝qpress
wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar xf qpress-11-linux-x64.tar
mv qpress /usr/local/bin/
#centos6安裝xtrabackup
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install libev -y
yum install percona-xtrabackup-24 -y
#新建backup.sh(來源未知)內容如下:
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 
BACKUP_BASE_DIR="/data/backup/xtrabackup"
INC_BASE_LIST="${BACKUP_BASE_DIR}/inc_list.txt"
XTRABACKUP_PATH="/usr/bin/innobackupex"
 
MYSQL_CNF="/etc/my.cnf"
MYSQL_HOSTNAME=127.0.0.1
MYSQL_USERNAME=root
MYSQL_PASSWORD=""
 
LOCK_FILE="/tmp/innobackupex.lock"
THREAD=3
 
mkdir -p ${BACKUP_BASE_DIR}
CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M)"
[[ -d ${CURRENT_BACKUP_PATH} ]] && CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M-%S)"
 
print_help(){
    echo "--------------------------------------------------------------"
    echo "Usage: $0 full | inc | help               "
    echo "--------------------------------------------------------------"
    exit 1
}
 
[[ $# -lt 1 || "$1" == "help" ]] && print_help
 
[[ -f "$LOCK_FILE" ]] && echo -e "Usage: rm -f $LOCK_FILE\nUsage: chattr -i $LOCK_FILE && rm -f $LOCK_FILE" && exit 1
 
FullBackup(){
    touch $LOCK_FILE
    chattr +i $LOCK_FILE
    local rc=0
    ${XTRABACKUP_PATH} \
    --defaults-file=${MYSQL_CNF} \
    --user=${MYSQL_USERNAME} \
    --password=${MYSQL_PASSWORD} \
    --host=${MYSQL_HOSTNAME} \
    --compress \
    --compress-threads=${THREAD} \
    --parallel=${THREAD} \
    --no-timestamp ${CURRENT_BACKUP_PATH} > ${CURRENT_BACKUP_PATH}_full.log 2>&1
    grep ".*\ completed\ OK\!" ${CURRENT_BACKUP_PATH}_full.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
        rc=1
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
        echo "NULL|${CURRENT_BACKUP_PATH}|full" >> ${INC_BASE_LIST}
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
    chattr -i ${LOCK_FILE}
    rm -f $LOCK_FILE
    chattr +a ${INC_BASE_LIST}
    return $rc
}
 
IncBackup(){
    touch $LOCK_FILE
    chattr +i $LOCK_FILE
    local rc=0
    PREV_BACKUP_DIR=$(sed '/^$/d' ${INC_BASE_LIST} | tail -1 | awk -F '|' '{print $2}')
    ${XTRABACKUP_PATH} \
    --defaults-file=${MYSQL_CNF} \
    --user=${MYSQL_USERNAME} \
    --password=${MYSQL_PASSWORD} \
    --host=${MYSQL_HOSTNAME} \
    --compress \
    --compress-threads=${THREAD} \
    --no-timestamp --incremental ${CURRENT_BACKUP_PATH} \
    --incremental-basedir=${PREV_BACKUP_DIR} > ${CURRENT_BACKUP_PATH}_inc.log 2>&1
    grep ".*\ completed\ OK\!" ${CURRENT_BACKUP_PATH}_inc.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
        rc=1
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
        echo "${PREV_BACKUP_DIR}|${CURRENT_BACKUP_PATH}|inc" >> ${INC_BASE_LIST}
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
    chattr -i ${LOCK_FILE}
    rm -f $LOCK_FILE
    chattr +a ${INC_BASE_LIST}
    return $rc
}
 
## 全量備份
if [ "$1" == "full" ];then
    FullBackup
fi
 
## 增量備份
if [ "$1" == "inc" ];then
    ## 若全量備份不存在,則執行全量備份
    if [[ ! -f ${INC_BASE_LIST} || $(sed '/^$/d' ${INC_BASE_LIST} | wc -l) -eq 0 ]];then
        FullBackup
    else
        IncBackup
    fi
fi
 
## 刪除22天前的備份
if [[ -d ${BACKUP_BASE_DIR} && $(pwd) != "/" ]];then
    find ${BACKUP_BASE_DIR} -name "$(date -d '22 days ago' +'%F')_*" | xargs chattr -i
    find ${BACKUP_BASE_DIR} -name "$(date -d '22 days ago' +'%F')_*" | xargs rm -rf
fi

#可能需要修改backup.sh中的如下參數
BACKUP_BASE_DIR="/data/backup/xtrabackup"
XTRABACKUP_PATH="/usr/bin/innobackupex"
 
MYSQL_CNF="/etc/my.cnf"
MYSQL_HOSTNAME=127.0.0.1
MYSQL_USERNAME=root
MYSQL_PASSWORD=""
#給腳本添加執行權限
chmod 755 /root/42/script/backup.sh
#执行一次全量备份
/root/42/script/backup.sh full
#如果沒有錯誤信息,就可以看到BACKUP_BASE_DIR下生成了備份文件
#檢查下cron是否啟動
service crond status
#如果未啟動則將cron設置為開機啟動並手動啟動下
chkconfig crond on
service crond start
#添加定時任務
crontab -e
#在底部新增內容
## 每周六凌晨3:30一次全量备份
## 每周二、四、日的凌晨3:30点执行增量备份
30 3 * * 6 /root/42/script/backup.sh full
30 3 * * 2,4,7 /root/42/script/backup.sh inc

本文更新於 2017/09/25。

分類
說說

17081812

“一警一辅”即可传唤抓捕
The dream need to be protected more.

分類
說說

17081218

被『黑幫三部曲番外篇』刷屏。

分類
软件

我的Git命令記錄

把本地項目傳到 Gitea

首先在 Gitea 新建項目,輸入項目名 YOUR_PROJECT_NAME,其他都不用動。

然後根據 Gitea 的提示,在本地執行下列命令:

#創建說明文檔
touch README.md
#創建忽略文檔,下面有個示例
touch .gitignore
#初始化 git 並推送至服務器
git init
git checkout -b main
(或 github 的 git branch -M main)
git add *
git commit -m "first commit"
git remote add origin https://git.disroot.org/user/YOUR_PROJECT_NAME.git
git push -u origin main

.gitignore 示例

# Django #
*.log
*.pot
*.pyc
__pycache__
db.sqlite3
/app1/migrations
/app1/profile_dir/*
*.lock

#mysite/settings.py
*.env
*.env_1
media
/static

# Backup files # 
*.bak 
*.log
*.log.*

# Eclipse # 
.project
.pydevproject

在服務器部署和更新 Git 代碼倉庫中的代碼

#Clone 項目到服務器
git clone https://git.disroot.org/user/YOUR_PROJECT_NAME.git
cd YOUR_PROJECT_NAME
#拉取代碼倉庫的更新
git fetch
git checkout origin main
[code]

<h3>?</h3>
<p>在服務器上初始化項目</p>
[code language="bash"]
cd /temp
git clone --bare /home/fred/Documents/workspace/amazon/.git amazon.git
scp -P 2009 -r amazon.git [email protected]:/data/42/git

在本地添加遠程項目

git remote add origin ssh://[email protected]:2009/data/42/git/amazon.git
git remote -v
#推送
git push origin master
#下載更新
git clone ssh://[email protected]:2009/data/42/git/unlock.git

在本地保存 github 登錄憑證

git config --global credential.helper store
#之後完一次需要鑒權的操作,登錄憑證就會保存在
#~/.git-credentials

本文更新於 2026/06/09。

分類
說說

外賣

早上看到樓道里的廣告,外面狂風暴雨,用戶享受外賣員冒風雨送來的食物非常開心。我和Emanon從不點外賣,如果是外面那麼大風雨,自己不願意淋雨就付錢讓別人淋,我們心裡過不去;如果是好天氣為什麼不自己出去吃呢,還能活動一下。另一個方面是外面的食物不可能比去店裡吃好吃,想象一下任何菜,直接出鍋裝盤上桌吃,和出鍋進外賣盒密封10分鐘吃口味色澤肯定是不同的。但現在似乎很多人完全不在乎口味,吃飯只是補充能量而以,並無樂趣可言。對於又懶又沒有味覺的人,我們表示遺憾;對於讓人變得更懶更麻木的公司,我們表示抵制。

分類
Linux

Fedora使用DNSCrypt

DNSCrypt是一種認證DNS客戶端和DNS解析器之間通信的協議。 它可以防止DNS欺騙。下面記錄下在Fedora25上使用DNSCrypt的步驟。

dnscrypt-proxy 2 是一個更棒的升級,如果你用的是v1,非常建議升級。官方的安裝文檔已經寫的很詳盡,這裡再簡單記錄一下。

#用超級用戶操作
su -s
#下載dnscrypt-proxy-linux_x86_64-2.0.25.tar.gz並解壓至/opt/dnscrypt-proxy/
#其實解壓到哪裡都無所謂啦
cd /opt/dnscrypt-proxy/
cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
#選擇性修改fallback dns如
fallback_resolver = '114.114.114.114:53'
#開啟分流文件
#曾經在不分流的情況下用了一年左右,奈何網絡持續惡化,現在不分流體驗會很差
#中國域名來自https://github.com/felixonmars/dnsmasq-china-list/blob/master/accelerated-domains.china.conf
#需要替換成dnscrypt-proxy的格式
forwarding_rules = '/home/fred/Programs/dnscrypt-proxy/forwarding-rules.txt'
./dnscrypt-proxy
#出現dnscrypt-proxy is ready即為成功,可以先Ctrl+C關閉
#执行下面命令使普通用戶也能運行dnscrypt-proxy
setcap cap_net_bind_service=+pe dnscrypt-proxy
#下面設置本機dns解析方法一:
cp /etc/resolv.conf /etc/resolv.conf.backup
nano /etc/resolv.conf
#文件內容如下
nameserver 127.0.0.1
options edns0 single-request-reopen
#下面設置本機dns解析方法二:
#右擊網絡連接圖標,選擇“編輯網絡連接”,選擇網絡,點齒輪圖標。
#在“IPv4設定”選項卡,Method選“只用自動(DHCP)位址”
#DNS servers填入127.0.0.1, 8.8.4.4,按“儲存”。
#右擊網絡連接圖標,反選啟用網絡,再勾選啟用網絡。
#設置完成,測試解析
./dnscrypt-proxy -resolve ft.shaman.eu.org
#如果返回了IP就說明OK

#自動啟動我都是用的xfce的啟動程序,位於
#應用程式選單/設定值/工作階段與初始啟動/應用程式自動啟動/加入
#指令框輸入/opt/dnscrypt-proxy/dnscrypt-proxy
#NetworkManager會在開機時生成重寫/etc/resolv.conf
#所以需要在NetworkManager的IPV4設定中指定127.0.0.1為dns服務器
#或者
#給resolv.conf上把鎖
chattr +i /etc/resolv.conf
#解鎖
chattr -i /etc/resolv.conf

如果想分享dnscrypt-proxy服務給局域網用戶,可以修改dnscrypt-proxy.toml中的監聽地址為['0.0.0.0:53']。然後開啟防火牆的53端口。

#查看已開啟的防火牆端口
sudo firewall-cmd --list-all
#開啟 DNS 端口自動(方法一)
sudo firewall-cmd --permanent --add-service=dns
#開啟 DNS 端口手動(方法二)
sudo firewall-cmd --permanent --add-port=53/udp
sudo firewall-cmd --permanent --add-port=53/tcp
#重啟防火牆
sudo firewall-cmd --reload

部分配置示例

#程序日誌
log_file = '/home/ft/Programs/dnscrypt-proxy/log.log'

#解析日誌
[query_log]
file = '/home/ft/Programs/dnscrypt-proxy/query.log'
ignored_qtypes = ['AAAA', 'DNSKEY', 'NS']

#域名黑名單
[blocked_names]
blocked_names_file = '/home/ft/Programs/dnscrypt-proxy/mybase_blocked-names.txt'
#此處使用的黑名單來自 https://download.dnscrypt.info/blacklists/domains/

#NextDNS 解析
[static]
  [static.'NextDNS-12abcd']
  stamp = 'sdns://AgEAAAAAAAAAAAAOZG5zLm5leHRkbnMuaW8HLzc3WiXnZO'
#使用 NextDNS 時還要設置 server_names
server_names = ['NextDNS-12abcd']

值得提醒的是,如果你使用 BT 下載,那麼很多黑名單是禁止 trackers 相關域名的,記得禁用這一條#tracker.*。自定義的 DNS 服務器可以使用 Online DNS Stamp calculator 來生成簽章。

不再實用的配置

安裝dnscrypt-proxy並新建一個執行用戶

sudo dnf install dnscrypt-proxy
sudo adduser -m -N  -r -s /bin/false dnscrypt

安裝完成後可以從/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv的第一列挑選一個服務商,我嘗試用香港的發現連接不上,於是選擇法國cs-fr。嘗試運行dnscrypt-proxy:

sudo dnscrypt-proxy -u dnscrypt -R cs-fr

我的桌面是Xfce,所以設置DNS很方便。找到程序/設定值/網路連線,選中需要編輯的網路點編輯。在IPv4設定面板中,如果你之前方法是“自動(DHCP)”,則變更方法為“只用自動(DHCP)位址”,並在DNS伺服器一欄填入127.0.0.1。如果之前就有固定IP,則只需要把DNS伺服器一欄改為127.0.0.1即可。多個DNS伺服器可以用半角逗號隔開。

如果沒有桌面環境,要設置DNS的話可以參考The adventurous can edit the appropriate script in /etc/sysconfig/network-scripts/. If you don't have NetworkManager installed, editing /etc/resolv.conf would work too.

重啟網絡服務已使剛剛新設置的DNS生效。可以使用dig驗證當前dns,出現SERVER: 127.0.0.1#53即說明成功。

sudo systemctl restart network.service
dig ft.wupo.info

設置自動重啟也很簡單,新建文件/etc/systemd/system/dnscrypt.service,內容如下:

[Unit]
Description=dnscrypt - Encrypted DNS service provided by OpenDNS
After=NetworkManager.service

[Service]
ExecStart=/usr/sbin/dnscrypt-proxy -u dnscrypt -R cs-fr
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=basic.target

重啟系統守護

sudo systemctl daemon-reload

添加dnscrypt到開啟啟動

sudo systemctl enable dnscrypt.service

當然你也可以手動通過systemctl命令來啟動和停止dnscrypt-proxy,像這樣:

sudo systemctl start dnscrypt.service

參考鏈接:Lucid Electric Dreams: Setting up dnscrypt on Fedora

本文更新於 2025/07/24。

分類
記事

fla文件損壞

端午節的第一天,Emanon在家用Flash畫了一天動畫線稿。晚上去吃了樓下新開的小火鍋店,口味一般。吃完飯感覺外面空氣不錯,還去深大湖邊遛了一圈。

回家後發現flash卡的不幸,幾乎無法動彈。Emanon有隨時保存文件的習慣,所以打算關掉Flash但是關閉也沒反應。等了一會兒,有反應了,彈出提示詢問是否保存,在本能的點擊“保存”按鈕後Flash又回到了假死狀態,期間又有過彈窗詢問是否關閉程序,選了關閉。

使用Win10的這兩個月,給我倆帶了無盡的痛苦,比如開機後時間總是不對,比如無線網卡總是總是莫名其妙斷線,比如顯示器完全隨機的出現黑屏……這些問題在另一塊硬盤的Ubuntu上都沒有出現,我只能懷疑win10。至於上面導致電腦卡的動不了,甚至文件管理器和關機都卡到爆的原因,也是windows在執行一個Antimalware Service Executable的進程,占滿了CPU。由於最後一次保存失敗,所以之前的fla文件只寫入了七百KB就斷掉了,fla文件便損壞了。

在網上找到一些搶救fla文件的方法都失敗了,因為我這種是損壞的太嚴重了。搶救方法有:讓朋友用高版本Flash打開,如果能打開則可另存檔案後發回來。或者複製一個fla文件,變更fla文件後綴名為zip,然後解壓開後嘗試找到並修正其中xml文件的錯誤。除了上面的方法還搜索到有種軟件號稱可以把swf轉換成fla,病急亂投醫,不僅沒有把fla轉會來反而中了使Win10感染了病毒。這裡要嚴重吐槽下Win10自帶的病毒防護軟件Windows Defender,我即使進行了全盤掃描,也未能根除感染的病毒。雖然雙系統重裝Windows比較麻煩,但這已經無法阻擋我返回Win7的決心了。

最後把線稿的輸出放上來緬懷下(手機應該是看不了swf):

获得 Adobe Flash Player