︿
Top

批次檔功能說明

原來的母資料夾中有許多子資料夾,裡面有各種檔案類型 (.jpg、.bmp、.psd、.doc、.xls),現在要將檔案給別人但僅要 .psd 檔案,而其它檔案類型 (.jpg、.bmp、.doc、.xls) 則不需要,若用檔案總管一個一個砍就砍到手軟,找一下指令還真有參數可以解決就記錄一下吧。

前言

需要把指定的資料夾內所有目錄 (含子目錄) 及檔案列出,該如何快速處理?你可以使用 Windows XP 內建的 dir 或 tree 指令來達成,試過後我個人覺得 tree 的輸出結果比較優。

批次檔功能說明

由於沒有用 Samba 架設 Domain Controller,因此若使用者要掛載網路磁碟機時還需要打密碼很麻煩,因此就用個簡單的批次檔放在啟動內,讓使用者開機就自動掛載 Samba 分享的目錄。

批次檔功能說明

公司內有架設 FreeBSD NTP Server 時間伺服器,可以把下列 ntp.bat 放在 Windows 作業系統的「啟動」內,如此一南每次開機時使用者電腦就會跟內部的 FreeBSD NTP Server 進行校時作業。

批次檔功能說明

需求是這樣的,我有 1 個母資料夾而裡面有 30 個子資料夾,我想知道「每個子資料夾內有幾個檔案」就好而不要列出詳細檔案名稱,發現利用 dir 指令配合 find 可以達到我要的需求。

批次檔功能說明

最近在轉公司的音樂檔隨便就轉了 8 千多首,要一個一個建資料夾在歸檔會歸死,所以突然想到把編號跟內容先用 excel 處理一下,在變成批次檔就搞定啦內容為先建資料夾在把相關檔案移到指定的目錄。

批次檔功能說明

會有這樣需求是因為公司沒有 Windows Server 機器,並且沒有 Windows 網域架構 (只有 Samba 架設的 PDC 而以),但是當新的 Windows Security Patch 出來後又想強迫使用者更新,所以利用此方式寫入到 Samba 所架構 PDC 中 Login.bat 內,這樣當使用者登入時就可順便強迫更新 Patch 了。

批次檔功能說明

最近在測 Audio box 連線狀況,因為常常 Run 幾小時後就當機且都是發生在下班後,懶得找軟體就寫個幾行批次檔就搞定了,基本上內容就是每分鐘去 Ping 10 次然後把結果寫到叫 ipbox.log 的文字檔內。

前言

若您所建立的 DNS Service 跟 Active Directory 整合,則您建立的 DNS 為 Active Directory 整合主要區,若是跟 Active Directory 未整合則為標準主要區,本文為實作利用  NTbackup 來備份 Active Directory 及 DNS (Active Directory 整合主要區)。
  • DNS 跟 AD 整合: Active Directory 整合主要區。
  • DNS 跟 AD 整合: 標準主要區。

前言

若您所建立的 DNS Service 未跟 Active Directory 整合,則您建立的 DNS 為標準主要區,若是跟 Active Directory 整合則為 Active Directory 整合主要區,本文為說明備份 DNS 標準主要區。
  • DNS 未 跟 AD 整合: 標準主要區。
  • DNS 有 跟 AD 整合: Active Directory 整合主要區。

前言

本文為配合批次檔使用三種方式「copy、export、dump」來備份 Windows DHCP 資料庫,其中若是有刪除單筆 DHCP 保留區記錄的話,將使用 export 備份方式是無法復原的,因為 export 為備份整個領域方式,所以變成要把整個領域砍掉在利用 import 來還原。若使用 copy、dump 則無此限制,而使用 export、dump 在備份及還原時此時 DHCP 服務為暫停的 (也就是暫時無法提供服務)。

批次檔功能說明

排程於每週六晚上 10 點利用備份批次檔 (videobk.bat),差異備份至 NFS Server 的 /home/video 資料夾內,以下為 videobk.bat 內容說明:

批次檔功能說明

排程於每天凌晨 1 點利用備份批次檔 (webbk.bat),定期備份網頁主目錄 (web01 ~ web05) 並配合 7-Zip 壓縮備份的網頁目錄,之後移動壓縮好的 .7z 檔案至本機下 D:\Web_Backup 資料夾內。

批次檔功能說明

排程於每週六晚上 10 點利用備份批次檔 (videobk.bat),差異備份至遠端主機 backup 下的 Movie 資料夾內,其中寫入指定的資料夾內而 Log 命名為當日 (ex.20060610),rem 為批前檔內註解,記錄開始備份、差異備份影片檔、結束備份等時間點均寫入 Log 內。
  • %date:~0,4% -->2006 (取得目前年份)
  • %date:~5,2% -->06 (取得目前月份)
  • %date:~8,2% -->10 (取得目前日期)

功能說明

此 VBScript 程式功能為將 Num Lock 開啟,不管是登入前 (Ctrl + Alt + Del 後輸入帳密時) 或是登入後 (成功驗證) 都開啟 Num Lock

功能說明

此 VBScript 程式功能為修改遠端桌面連線登入 (Terminal Service) 預設 Port Number(3389),下列 VBScript 將遠端桌面連線登入 Port Number 改為 16888

功能說明

此 VBScript 程式功能為將本機安全性選項中的匿名使用者連線的其它限制,設定成 不允許 SAM 帳戶和共用的列舉

功能說明

此 VBScript 程式功能為將「取消」所有預設共用 (C$、D$...etc)。

功能說明

此 VBScript 功能為,當你執行登入時「」會看到「前次登入」的使用者名稱。

以下為 Windows 錯誤代碼的相關說明一覽表,順序為「代碼、數值、敘述」:

1、前言

What is Blastwave.org ? 簡單來說 Blastwave 就是幫您把自由軟體收集起來讓 x86 及 Sparc 使用者容易安裝套件只要打 pkg-get install 套件名稱 就可清鬆安裝套件了;使用 pkg-get 安裝的套件開頭名稱為 CSW (Community Software for Solaris)。

1、前言

Pstree- List processes as a tree,當我們打 ps 會列出執行序 (Processes) 因此 pstree 我們可以顧明思義的了解其功能為將 ps 列成樹狀 (tree),可看到 PID、user、COMMAND 以便讓我們更了解執行序的樹狀結構,以補充 ps 資訊的不足。

1、前言

Top 在 Solaris 10 沒有內建因此我們必須另外安裝,Top 套件能夠動態提供系統行程 (Process) 資訊、CPU 使用率、負載狀態....等,預設為 5 秒更新畫面。



前言

下列是 Cisco C2900 在 VLAN 部份的組態設定:



前言

下列為 Cisco C2900 的一些基本設定:



Show 命令

下列為 Cisco 環境中,常用的 show, ping, trace 指令:

以下為個人在家目錄設定檔 .vimrc 設定檔案資訊:



常用組合鍵

以下是在操作 Cisco 環境時,常用的組合鍵:

前言

預設情況下,所有的 Ports 都為「Enable」狀態,也就是只要插上網路線就會通,我們可以利用下列介紹的指令使該 Ports Enable 或 Disable,可以提高 Switch 的實體安全性,以防止有人只要插上網路線就會通的狀況 (就可以聽封包了!!)。

前言

本文將說明 Extreme Summit 400-24T,在使用者帳號及管理權限的部份進行操作。



前言

本文將說明 Extreme Summit 400-24T Switch,用來測試網路連通狀態的 ping 指令,以及用來測試路由狀態的 traceroute 指令。

前言

以下是在操作 Extreme Summit 400-24T L3 Switch 之前,必須要了解的一些基本操作。


以下為個人在 Solaris 下的 .vimrc 環境設定內容:

前言

在設定 Extreme L3 Switch ACL (Access Control List) 功能以前,先了解下面名詞所代表的意義,這樣可以有助於你後續的設定:

前言

這是給 Shell csh、tcsh 用內定的環境設定檔案(當登入時就套用這些設定),若是設定此檔則所有使用 csh 及 tcsh 使用者都會套用此設定檔,若此檔與使用者家目錄的內的 .cshrc 有衝突時則會以家目錄設定優先載入。

前言

當 LDAP 上線服務前第一個要思考的問題當然就是災難復原了,預計讓系統每天凌晨自動備份 LDAP LDIF (LDAP Data Interchange Format),並透過 amd (automounter daemon) mount 方式將 LDAP LDIF 備份資料寫入至備份伺服器中。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。

daily.local 達成如下需求

  • 系統會每天凌晨時自動執行 daily.local 內指定的 Script 內容 (正常情況為凌晨 3 ~ 4 點間)。

backup_ldif.sh 達成如下需求

  • 每天定期備份 LDAP LDIF 資料。

備份 LDAP LDIF 資料流程說明

  1. 先判斷備份 LDAP LDIF 資料夾只留備份日期距離目前最新的 90 個資料夾。
  2. 將 SLAPD database to LDIF utility。
  3. 匯出 LDAP Database 內容 LDIF 檔。

還原 LDAP LDIF 資料流程說明

  1. 停止 slapd 服務 (停止資料寫入)。
  2. 將先前備份的 LDIF 資料複製到本機下。
  3. 匯入 LDAP LDIF 檔。
  4. 啟動 slapd 服務。


實作環境

  • FreeBSD 6.1-RELEASE-p12


Script 內容及如何匯出匯入 LDAP LDIF 資料檔

daily.local 內容

將 backup_ldif.sh 路徑寫入 daily.local 中以便系統每天自動執行備份 LDAP LDIF Script。
#cat /etc/daily.local
 #!/bin/sh
 /usr/local/sbin/backup_ldif.sh



backup_ldif.sh 內容 (匯入 LDAP LDIF 資料檔)

1. #!/bin/sh
2. # $Id: backup_ldif.sh,v 1.0 2006/10/03 14:25:26 weithenn Exp $
3. # Backup LDAP LDIF Script
4. TODAY=`date +%Y%m%d`
5. DESTDIR="/host/backup/home/database/ldap/ldif"
6. KEEPN="90"
7. BKLDIF="/usr/local/sbin/slapcat -f /usr/local/etc/openldap/slapd.conf -l"
8.
9. #Check KEEP Directory
10. if [ -d ${DESTDIR} ]; then
11.       cd ${DESTDIR}
12.       N=`ls -1|grep -e '[0-9]'|wc -l`
13.       if [ ${N} -gt ${KEEPN} ]; then
14.            echo "Removing Stale Backup LDIF..."
15.            ls -1 | grep -e '[0-9]'|sort -nr|tail -`expr ${N} - ${KEEPN}` | xargs rm -r
16.            echo "Finished"
17.       fi
18.       echo "Backup LDIF..."
19.       cd ${DESTDIR} ; ${BKLDIF} ${TODAY}.ldif
20. fi
21.
22. cd /
23. sync;sync;sync



解說 backup_ldif.sh 內容:

  • 4:執行日期指令(執行時建立的資料夾命名即為當天日期)。
  • 5:指定屆時存放 LDAP LDIF 檔資料夾(透過 amd 方式 mount 備份伺服器)。
  • 6:指定留存日期最新的 90 個資料夾(加上新備份的共會有 91 個資料夾)。
  • 7:指定將 SLAPD database to LDIF utility。
  • 10:判斷存放 LDAP LDIF 檔資料夾是否存在(判斷第 5 行目錄是否存在)。
  • 11:切換至 LDAP LDIF 檔資料夾。
  • 12 ~ 17:只留日期最新的 91 個資料夾,其餘舊的資料夾都刪除。
  • 19:匯出 LDAP Database 內容 LDIF 檔。


匯入 LDAP LDIF 資料檔

slapadd -f /usr/local/etc/openldap/slapd.conf -l 【指定要還原的 ldif 檔案】

前言

當 LDAP 上線服務前第一個要思考的問題當然就是災難復原了,預計讓系統每天凌晨自動備份 LDAP BDB (Berkeley DataBase),並透過 amd (automounter daemon) mount 方式將 LDAP BDB 備份資料寫入至備份伺服器中。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。

daily.local 達成如下需求

  • 系統會每天凌晨時自動執行 daily.local 內指定的 Script 內容 (正常情況為凌晨 3 ~ 4 點間)。

backup_bdb.sh 達成如下需求

  • 每天定期備份 LDAP BDB 資料庫。

備份 LDAP BDB 資料庫流程說明

  1. 先判斷備份 LDAP BDB 資料夾只留備份日期距離目前最新的 90 個資料夾。
  2. 停止 slapd 服務 (停止資料寫入)。
  3. 執行 db_checkpoint 確保資料都寫入 LDAP BDB 資料庫中。
  4. 複製所有資料庫檔案 (*.bdb) 至備份伺服器。
  5. 複製所有資料庫 Log(log.*) 至備份伺服器。
  6. 啟動 slapd 服務。

還原 LDAP BDB 資料庫流程說明

  1. 停止 slapd 服務 (停止資料寫入)。
  2. 將先前備份的(*.bdb,log.*******) 複製到 /var/db/openldap-data。
  3. 執行 db_recover 還原資料庫。
  4. 啟動 slapd 服務。


實作環境

  • FreeBSD 6.1-RELEASE-p12


Script 內容及如何備份還原 LDAP BDB 資料庫

daily.local 內容

將 backup_bdb.sh 路徑寫入 daily.local 中以便系統每天自動執行備份 LDAP BDB Script。
#cat /etc/daily.local
 #!/bin/sh
 /usr/local/sbin/backup_bdb.sh


backup_bdb.sh Script 內容 (備份 LDAP BDB 資料庫)

1. #!/bin/sh
2. # $Id: backup_bdb.sh,v 1.0 2006/10/03 14:25:26 weithenn Exp $
3. # Backup Berkeley DB Database Script
4. TODAY=`date +%Y%m%d`
5. DESTDIR="/host/backup/home/database/ldap/bdb"
6. KEEPN="90"
7. STARTLDAP="/usr/local/etc/rc.d/slapd start"
8. STOPLDAP="/usr/local/etc/rc.d/slapd stop"
9. SYNCBDB="/usr/local/bin/db43/db_checkpoint -1 -h /var/db/openldap-data"
10. CPBDB="cp -p /var/db/openldap-data/*.bdb"
11. CPLOG="cp -p /var/db/openldap-data/log.*"
12.
13. #Check Stale Directory
14. if [ -d ${DESTDIR} ]; then
15.       mkdir -p ${DESTDIR}/${TODAY};cd ${DESTDIR}/${TODAY}
16.       N=`ls -1|grep -e '[0-9]'|wc -l`
17.       if [ ${N} -gt ${KEEPN} ]; then
18.            echo "Removing Stale Backup BDB..."
19.            ls -1 | grep -e '[0-9]'|sort -nr|tail -`expr ${N} - ${KEEPN}` | xargs rm -r
20.            echo "Finished"
21.       fi
22.       echo "Stop Slapd Service"
23.       ${STOPLDAP}
24.       echo "Sync Data Write BDB"
25.       ${SYNCBDB}      
26.       echo "Backup BDB"
27.       ${CPBDB} ${DESTDIR}/${TODAY}
28.       echo "Backup BDB Log"
29.       ${CPLOG} ${DESTDIR}/${TODAY}
30.       echo "Start Slapd Service"
31.       ${STARTLDAP}      
32. fi
33. cd /;sync;sync;sunc




解說 backup_bdb.sh 內容:
4:執行日期指令(執行時建立的資料夾命名即為當天日期)。
5:指定屆時存放 LDAP BDB 資料夾路徑(透過 amd 方式 mount 備份伺服器)。
6:指定留存日期最新的 90 個資料夾(加上新備份的共會有 91 個資料夾)。
7:指定啟動 slapd 服務指令。
8:指定停止 slapd 服務指令。
9:指定 db_checkpoint 指令以確保所有資料都正確寫入資料庫中。
10:指定要複製的 LDAP 資料庫檔案(*.bdb)。
11:指定要複製的 LDAP 資料庫Log(log.*)。
14:判斷存放 LDAP BDB 資料夾是否存在(判斷第五行目錄是否存在)。
15:切換至 LDAP BDB 資料夾並建立一個以今天日期命名的資料夾。
17 ~ 21:只留日期最新的 91 個資料夾,其餘舊的資料夾都刪除。
22 ~ 31:備份 LDAP BDB 至備份伺服器後啟動 slapd 服務。


還原 LDAP BDB 資料庫

#/usr/local/etc/rc.d/slapd stop       //停止 slapd 服務(停止資料寫入)
將先前備份的(*.bdb,log.*******) 複製到 /var/db/openldap-data。
#db_recover-4.3 -h /var/db/openldap-data   //執行 db_recover 還原資料庫
#/usr/local/etc/rc.d/slapd start            //啟動 slapd 服務

1、前言

當 MySQL 上線服務前第一個要思考的問題當然就是災難復原了,預計讓系統每天凌晨自動備份 MySQL 使用 HotCopy 備份方式,之後使用 Rsync 方式將遠端備份好的 MySQL HotCopy 檔案同步回來,並透過 amd (automounter daemon) mount 方式將 MySQL HotCopy 備份資料寫入至備份伺服器中 (遠端路徑使用 /host/機器名稱),當然前提是你已經設好管理 MySQL 帳號及密碼在 /etc/my.cnf 檔案內。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。


備份 MySQL DB 流程說明:

  1. 遠端 MySQL Server 每天定期執行 sqlcopy.sh 來備份 MySQL 資料庫。
  2. 只保留最新 3 天的備份 MySQL Database 資料夾。
  3. 本地端的機器每天定期將遠端 MySQL Server 所備份 HotCopy 資料夾透過 Rsync 方式同步回來。

文章目錄

1、前言
2、實作環境
3、Script 功能說明
          daily.local 達成需求
          sqlcopy.sh 達成需求
          sqlcopy.sh 達成需求
          sqlcopy_list.sh 達成需求
          mysql_rsync.sh 達成需求
          /etc/my.cnf 達成需求
4、Script 內容說明
          daily.local 內容 (每天定期執行)
          sqlcopy.sh 內容 (備份 MySQL 資料庫)
          解說 sqlcopy.sh 內容
          sqlcopy_list.sh 內容 (指定要備份的 MySQL 資料庫)
          mysql_rsync.sh 內容 (同步備份好的 MySQL 資料庫回本地端)
          解說 mysql_rsync.sh 內容
5、參考
6、Me FAQ
          Q1.無法使用 mysqlhotcopy 出現訊息 Access denied; you need the RELOAD privilege?
          Q2.無法執行 mysqlhotcopy 並出現 Invalid db.table name?
          Q3.系統沒有 mysqlhotcopy 指令?


2、實作環境

  • FreeBSD 6.1-RELEASE-p12
  • rsync-2.6.9


3、Script 功能說明

daily.local 達成需求

  • 系統會每天凌晨時自動執行 daily.local 內指定的 Script 內容 (正常情況為凌晨 3 ~ 4 點間)。

sqlcopy.sh 達成需求

  • 每天定期利用指令 mysqlhotcopy 來備份指定的 MySQL 資料庫。
  • 可指定保留幾天份的 MySQL 資料庫。

sqlcopy_list.sh 達成需求

  • 利用指令 mysqlhotcopy 來備份指定的 MySQL 資料庫。

mysql_rsync.sh 達成需求

  • 將遠端備份完成的 MySQL 資料庫 HotCopy 檔案同步回來至本地端。

/etc/my.cnf 達成需求

填入管理 MySQL 的帳號、密碼資訊內容如下 (這裡的 root 帳號指的是 MySQL 的管理帳號跟系統的 Super User root 沒任何關系)。
 [client]
 user=root           //管理 MySQL 資料庫的帳號
 password=1234      //管理 MySQL 資料庫帳號的密碼



4、Script 內容說明

daily.local 內容 (每天定期執行)

將 sqlcopy.sh 路徑寫入 daily.local 中以便系統每天自動執行備份 MySQL 資料庫的 Script。
#cat /etc/daily.local
 #!/bin/sh
 /usr/local/sbin/sqlcopy.sh


sqlcopy.sh 內容 (備份 MySQL 資料庫)

自動執行備份 MySQL 資料庫的 sqlcopy.sh Script 內容如下:
 1. #!/bin/sh
 2. #$Id: sqlcopy.sh,v 0.1 2006/12/18 weithenn Exp $
 3. #Daily HotCopy MySQL DB Script
 4. TODAY=`date +%Y%m%d`
 5. COPYDESTDIR="/home/backup/mysql/copy"
 6. COPYCONF="/usr/local/sbin/sqlcopy_list.sh"
 7. KEEPN="3"
 8.
 9. if [ -d ${COPYDESTDIR} ]; then
 10.      cd ${COPYDESTDIR}
 11.      N=`ls -1|grep -e '[0-9]'|wc -l`
 12.      if [ ${N} -gt ${KEEPN} ]; then
 13.            echo "Removing Stale MySQL DB Backup..."
 14.            ls -1 | grep -e '[0-9]'|sort -nr|tail -`expr ${N} - ${KEEPN}` | xargs rm -r
 15.             echo "Finished"
 16.      fi
 17.      mkdir -p ${COPYDESTDIR}/${TODAY}
 18.      if [ -f ${COPYCONF} ]; then
 19.             cd ${COPYDESTDIR}/${TODAY};${COPYCONF}
 20.      else
 21.             echo "Configuration File ${COPYCONF} does not exist!!"
 22.             exit 1
 23.      fi
 24. fi



解說 sqlcopy.sh 內容

  • 4:執行日期指令(到時建的資料夾命名即為當天日期)。
  • 5:指定執行 MySQL HotCopy 指令後存放的目錄夾路徑。
  • 6:指定要備份的 MySQL 列表(當有超過一個以上 DB 要備份時比較方便)。
  • 7:指定資料夾只留三個(加上新備份的共會有四個資料夾)。
  • 9:判斷存放 MySQL HotCopy 目錄是否存在。
  • 10:目錄存在則切換至存放 MySQL HotCopy 目錄路徑。
  • 11 ~ 16:只留日期最新的三個資料夾,其餘舊的資料夾都刪除。
  • 17:建立以今天日期為名的資料夾。
  • 18:判斷備份 MySQL 列表的 Script 是否存在。
  • 19:備份 MySQL 列表的 Script 存在的話,就開始執行 sqlcopy_list.sh 的內容。
  • 20 ~ 23:若備份 MySQL 列表的 Script 不存在則顯示字串訊息並離開此 Script。

sqlcopy_list.sh 內容 (指定要備份的 MySQL 資料庫)

指定要備份的 MySQL 資料庫 sqlcopy_list.sh Script 內容如下,但如果您想一次備份所有的資料庫您可以使用參數 --all-databases 就會備份所有資料庫而不用一一條列,條件的目的是假如你可能有 10 個 MySQL 資料庫而你只想備份其中的 5 個資料庫時就可利用條列的方式。
#!/bin/sh
 echo Backup Xoops MySQL DB
 /usr/local/bin/mysqlhotcopy xoops .     //備份資料庫資料夾名稱為 xoops
 echo Backup Joomla MySQL DB
 /usr/local/bin/mysqlhotcopy joomla .    //備份資料庫資料夾名稱為 joomla
 echo Backup PHPBB MySQL DB
 /usr/local/bin/mysqlhotcopy phpbb .     //備份資料庫資料夾名稱為 phpbb


mysql_rsync.sh 內容 (同步備份好的 MySQL 資料庫回本地端)

同步備份好的 MySQL 資料庫回本地端 mysql_rsync.sh Script 內容如下:
 1. #!/bin/sh
 2. #$Id: mysql_rsync.sh,v 0.1 2006/12/18 weithenn Exp $
 3. #Rsync MySQL DB Script
 4. export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 5. SRCDIR=/host/mysql/home/db/mysql
 6. DESTDIR=/home/database/mysql
 7. RSYNC=""/usr/local/bin/rsync -avP""
 8. DBREPL="${RSYNC} ${SRCDIR} ${DESTDIR}"
 9.
 10. if [ ! -d ${SRCDIR} ]; then
 11.     echo "Source Directory does not exist!!"
 12.        exit 0;
 13. fi
 14.
 15. echo "Syncing Co-Location MySQL db..."
 16. ${DBREPL}


解說 mysql_rsync.sh 內容

  • 5:指定遠端存放備份 MySQL DB 路徑(來源)。
  • 6:指定同步回來存放 MySQL DB 路徑(目的地)。
  • 7:Rsync同步指令。
  • 8:結合 5,6,7 行的結果。
  • 10 ~ 13:在執行同步以前先檢查遠端存放備份 MySQL DB 目錄是否存在,若不存在則離開程式。
  • 15:顯示開始同步 MySQL DB 字串。
  • 16:開始執行同步。


5、參考



6、Me FAQ

Q1.無法使用 mysqlhotcopy 出現訊息 Access denied; you need the RELOAD privilege?

Error Message:
無法正常使用 mysqlhotcopy 並出現如下錯誤訊息?
DBD::mysql::db do failed: Access denied; you need the RELOAD privilege for this operation at /usr/bin/mysqlhotcopy line 472.
Ans:
原因就是必須要使用對該資料庫有管理權限的帳號才行(通常是root),而本帳號對資料庫權限僅有資料、結構而已,沒有系統管理權限。


Q2.無法執行 mysqlhotcopy 並出現 Invalid db.table name?

Error Message:
無法執行 mysqlhotcopy 並出現如下錯誤訊息?
#/usr/local/bin/mysqlhotcopy xoops > /home/test
 Invalid db.table name 'xoops.xoops`.`activity' at /usr/local/bin/mysqlhotcopy line 855.

Ans:
找到了 MySQL Bugs: #27303: mysqlhotcopy dies with error Invalid db.table name 'foo.bar`.`baz' 說明將 mysqlhotcopy 檔案修改一下後即可順利執行 mysqlhotcopy 了。
#vi /usr/local/bin/mysqlhotcopy    //在第 835 下新增一行
 835     my @dbh_tables = eval { $dbh->tables() };
 836     map { s/^.*?\.//o } @dbh_tables;     //加入此行



Q3.系統沒有 mysqlhotcopy 指令?

Error Message:
執行 mysqlhotcopy 指令後發現系統並沒有這個指令並出現如下錯誤訊息?
#/usr/local/bin/mysqlhotcopy
 mysqlhotcopy: Command not found.

Ans:
請安裝在您 Ports 目錄下對應你 MySQL Server 版本的 Script 目錄去安裝,此例我安裝的 MySQL Server 版本為 mysql51-server 所以去安裝對應的 mysql51-scripts。
#cd /usr/ports/databases/mysql51-scripts
#make install clean
#pkg_info -L mysql-scripts-5.1.18 | grep mysqlhotcopy
   /usr/local/bin/mysqlhotcopy    //可發現有此指令了

前言

當 MySQL 上線服務前第一個要思考的問題當然就是災難復原了,預計讓系統每天凌晨自動備份 MySQL 使用 Dump 備份方式,之後使用 Rsync 方式將遠端備份好的 MySQL Dump 檔案同步回來,並透過 amd (automounter daemon) mount 方式將 MySQL Dump 備份資料寫入至備份伺服器中 (遠端路徑使用/host/機器名稱),當然前提是你已經設好管理 MySQL 帳號及密碼在 /etc/my.cnf 檔案內。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。


備份 MySQL DB 流程說明:

  1. 遠端 MySQL Server 每天定期執行 sqldump.sh 來備份 MySQL 資料庫。
  2. 只保留最新 3 天的備份 MySQL Database 資料夾。
  3. 本地端的機器每天定期將遠端 MySQL Server 所備份 Dump 資料夾透過 Rsync 方式同步回來。


實作環境

  • FreeBSD 6.1-RELEASE-p12
  • rsync-2.6.9 


Script 功能說明

daily.local 達成需求

  • 系統會每天凌晨時自動執行 daily.local 內指定的 Script 內容 (正常情況為凌晨 3 ~ 4 點間)。

sqldump.sh 達成需求

  • 每天定期利用指令 mysqldump 來備份指定的 MySQL 資料庫。
  • 可指定保留幾天份的 MySQL 資料庫。

sqldump_list.sh 達成需求

  • 利用指令 mysqldump 來備份指定的 MySQL 資料庫。

mysql_rsync.sh 達成需求

  • 將遠端備份完成的 MySQL 資料庫 Dump 檔案同步回來至本地端。

/etc/my.cnf 達成需求

填入管理 MySQL 的帳號、密碼資訊內容如下 (這裡的 root 帳號指的是 MySQL 的管理帳號跟系統的 Super User root 沒任何關系)。
 [client]
 user=root         //管理 MySQL 資料庫的帳號
 password=1234     //管理 MySQL 資料庫帳號的密碼



Script 內容說明

daily.local 內容 (每天定期執行)

將 sqldump.sh 路徑寫入 daily.local 中以便系統每天自動執行備份 MySQL 資料庫的 Script。
 #cat /etc/daily.local
   #!/bin/sh
 / usr/local/sbin/sqldump.sh


sqldump.sh 內容 (備份 MySQL 資料庫)

自動執行備份 MySQL 資料庫的 sqldump.sh Script 內容如下:
 1. #!/bin/sh
 2. #$Id: sqldump.sh,v 0.1 2006/12/18 weithenn Exp $
 3. #Daily Dump MySQL DB Script
 4. TODAY=`date +%Y%m%d`
 5. DUMPDESTDIR="/home/backup/mysql/dump"
 6. DUMPCONF="/usr/local/sbin/sqldump_list.sh"
 7. KEEPN="3"
 8.
 9. if [ -d ${DUMPDESTDIR} ]; then
 10.      cd ${DUMPDESTDIR}
 11.      N=`ls -1|grep -e '[0-9]'|wc -l`
 12.      if [ ${N} -gt ${KEEPN} ]; then
 13.            echo "Removing Stale MySQL DB Backup..."
 14.            ls -1 | grep -e '[0-9]'|sort -nr|tail -`expr ${N} - ${KEEPN}` | xargs rm -r
 15.             echo "Finished"
 16.      fi
 17.      mkdir -p ${DUMPDESTDIR}/${TODAY}
 18.      if [ -f ${DUMPCONF} ]; then
 19.             cd ${DUMPDESTDIR}/${TODAY};${DUMPCONF}
 20.      else
 21.             echo "Configuration File ${DUMPCONF} does not exist!!"
 22.             exit 1
 23.      fi
 24. fi


解說 sqldump.sh 內容:

  • 4: 執行日期指令(到時建的資料夾命名即為當天日期)。
  • 5: 指定執行 MySQL Dump 指令後存放的目錄夾路徑。
  • 6: 指定要備份的 MySQL 列表(當有超過一個以上 DB 要備份時比較方便)。
  • 7: 指定資料夾只留三個(加上新備份的共會有四個資料夾)。
  • 9: 判斷存放 MySQL Dump 目錄是否存在。
  • 10: 目錄存在則切換至存放 MySQL Dump 目錄路徑。
  • 11 ~ 16: 只留日期最新的三個資料夾,其餘舊的資料夾都刪除。
  • 17: 建立以今天日期為名的資料夾。
  • 18: 判斷備份 MySQL 列表的 script 是否存在。
  • 19: 備份 MySQL 列表的 script 存在的話,就開始執行 sqldump_list.sh 的內容。
  • 20 ~ 23: 若備份 MySQL 列表的 script 不存在則顯示字串訊息並離開此 script。

sqldump_list.sh 內容 (指定要備份的 MySQL 資料庫)

指定要備份的 MySQL 資料庫 sqldump_list.sh Script 內容如下,但如果您想一次備份所有的資料庫您可以使用參數 --all-databases 就會備份所有資料庫而不用一一條列,條件的目的是假如你可能有 10 個 MySQL 資料庫而你只想備份其中的 5 個資料庫時就可利用條列的方式。
 #!/bin/sh
 echo Backup Xoops MySQL DB
 /usr/local/bin/mysqldump xoops > xoops.sql     //備份資料庫名稱為 xoops
 echo Backup Joomla MySQL DB
 /usr/local/bin/mysqldump joomla > joomla.sql   //備份資料庫名稱為 joomla
 echo Backup PHPBB MySQL DB
 /usr/local/bin/mysqldump phpbb > phpbb.sql     //備份資料庫名稱為 phpbb
 chmod -R 600 /home/backup/mysql/dump


mysql_rsync.sh 內容 (同步備份好的 MySQL 資料庫回本地端)

同步備份好的 MySQL 資料庫回本地端 mysql_rsync.sh Script 內容如下:
 1. #!/bin/sh
 2. #$Id: mysql_rsync.sh,v 0.1 2006/12/18 weithenn Exp $
 3. #Rsync MySQL DB Script
 4. export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 5. SRCDIR=/host/mysql/home/db/mysql
 6. DESTDIR=/home/database/mysql
 7. RSYNC=""/usr/local/bin/rsync -avP""
 8. DBREPL="${RSYNC} ${SRCDIR} ${DESTDIR}"
 9.
 10. if [ ! -d ${SRCDIR} ]; then
 11.     echo "Source Directory does not exist!!"
 12.        exit 0;
 13. fi
 14.
 15. echo "Syncing Co-Location MySQL db..."
 16. ${DBREPL}


解說 mysql_rsync.sh 內容:

  • 5:指定遠端存放備份 MySQL DB 路徑(來源)。
  • 6:指定同步回來存放 MySQL DB 路徑(目的地)。
  • 7:Rsync同步指令。
  • 8:結合 5,6,7 行的結果。
  • 10 ~ 13:在執行同步以前先檢查遠端存放備份 MySQL DB 目錄是否存在,若不存在則離開程式。
  • 15:顯示開始同步 MySQL DB 字串。
  • 16:開始執行同步。


參考



Me FAQ

Q1.執行 mysqldump 時出現找不到某一個 tables 並且中斷執行?

Error Message:
執行 mysqldump 時出現找不到某一個 tables 並且中斷執行?
#/usr/local/bin/mysqldump xoops > xoops.sql    //執行 mysqldump 並出現如下錯誤訊息
 mysqldump: Got error: 1146: Table 'xoops.vote_results' doesn't exist when using LOCK TABLES

找了 google 說加上 --skip-lock-tables 試試,也是不行。
#/usr/local/bin/mysqldump --skip-lock-tables xoops > xoops.sql
 Error: Couldn't read status information for table vote_results ()
 mysqldump: Couldn't execute 'show create table `vote_results`': Table 'xoops.vote_results' doesn't exist (1146)

進入 phpmyadmin 管理介面後關於此 vote_results table 的徵狀。
  1. 並沒有看到 vote_results table。
  2. 但使用指令 show tables; 卻有看到 vote_results table。
  3. 使用 drop table vote_results 又說該 table 不存在無法 drop。
  4. 至 mysql 目錄下有看到 vote_results.frm 檔案。
Ans:
反正這也只是投票的結果而以,就把 vote_results.frm 檔案拿掉,並重新啟動 mysqld 後,就可順利執行 mysqldump 了。

前言

繼上一篇 OpenLDAP-ldapadduser.sh Script,我們利用 Script 來簡化當有新進同仁加入時建帳號的過程,相對的當有同仁離職時我們也是要手動下一堆指令來處理 (ex. 刪除該帳號加到所屬的 Mail Aliases...etc),因此開始寫下面的 script 了。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。

rmuser_ldap.sh 達成如下需求:
  1. 刪除 user dn 資料。
  2. 刪除 user 家目錄及 (含 Maildir)。
  3. 刪除 user 在 Mail Aliases 內 Reload Aliases。
  4. 執行 slurpd One-shot 同步至 LDAP Slaver。


實作環境

  • FreeBSD 6.1-STABLE
  • dialog version 0.3


rmuser_ldap.sh Script 內容如下:

1 #!/bin/sh
2 # $Id: adduser.sh,v 1.6 2006/12/18 weithenn Exp $
3 # Remove LDAP User Script
4
5 USERNAME=`mktemp /tmp/dialog.XXXXXX` || exit 1
6 LDAPUSER=`mktemp /tmp/dialog.XXXXXX` || exit 1
7 ALIASESUSER=`mktemp /tmp/dialog.XXXXXX` || exit 1
8 HOMEPATCH="/home/user"
9 ALIASES="/usr/local/etc/postfix/aliases"
10 TMPFILE="/tmp/dialog.aliases"
11 TODAY=`date +%Y%m%d`
12 DNBASE="dc=weithenn,dc=idv,dc=tw"
13 TITLE="刪除 LDAP 使用者帳號"
14 M4="/tmp/dialog.m4"
15 M5="/tmp/dialog.m5"
16 M6="/tmp/dialog.m6"
17
18 dialog --title "$TITLE" --inputbox "請輸入欲刪除的使用者帳號" 10 70 "ittest" 2>"$USERNAME"
19
20 #Read LDAP,aliases
21 ldapsearch -x | grep -o `cat "$USERNAME"` | head -1 > "$LDAPUSER"
22 grep -o `cat "$USERNAME"` ${ALIASES} | head -1 > "$ALIASESUSER"
23
24
25 if [ `cat "$LDAPUSER"` = `cat "$USERNAME"` ]; then
26    echo "dn: uid=`cat "$USERNAME"`,ou=People... Entry exist" > $M4
27 else
28    echo "【Warning】dn: uid=`cat "$USERNAME"`,ou=People... Entry does not exist!!" > $M4
29 fi
30
31 if [ -d ${HOMEPATCH}/`cat "$USERNAME"` ]; then
32    echo "`cat "$USERNAME"` Home Directory exist" > $M5
33 else
34    echo "【Warning】`cat "$USERNAME"` Home Directory does not exist!!" > $M5
35 fi
36
37 if [ `cat "$ALIASESUSER"` = `cat "$USERNAME"` ]; then
38    echo "`cat "$USERNAME"` Mail Aliases exist" > $M6
39 else
40    echo "【Warning】`cat "$USERNAME"` Mail Aliases does not exist!!" > $M6
41 fi
42
43 dialog --yesno "確定刪除使用者:【`cat "$USERNAME"`】\n`cat "$M4"`\n`cat "$M5"`\n`cat "$M6"`" 10 70
44
45 #press yes then delete user data
46 if [ $? = "0" ]; then
47    ldapdelete -x -D "cn=Manager,${DNBASE}" -W "uid=`cat "$USERNAME"`,ou=People,${DNBASE}"
48    sed -e 's/'`cat "$USERNAME"`',//' ${ALIASES} > ${TMPFILE}
49    cp ${TMPFILE} ${TMPFILE}.${TODAY}
50    mv ${TMPFILE} ${ALIASES}
51    postalias ${ALIASES}
52    rm -r "${HOMEPATCH}/`cat "$USERNAME"`"
53    /usr/local/etc/rc.d/slurpd start
54    dialog --title "$TITLE" --msgbox "Delete【`cat "$USERNAME"`】Successful!! \n\nDelete Entry in ou=People,${DNBASE} \nDelete Home Directory \nDelete in Mail Aliases \nReload Mail Aliases(postaliases)" 10 70
55    rm /tmp/dialog.*
56 else
57    dialog --title "$TITLE" --msgbox "刪除【`cat "$USERNAME"`】失敗!!" 8 70
58 fi



解說 rmuser_ldap.sh 內容:

  • 5 ~ 16:定義參數。
  • 18:跳出 dialog 對話窗輸入欲刪除的使用者帳號。
  • 21:執行 ldapsearch 搜尋 LDAP 是否有您剛才第 18 行 dialog 對話窗中輸入的 username 存在,若存在只取第一個 usernmae 即可,並寫入 $LDAPUSER 暫存檔內。
  • 22:搜尋 /usr/local/etc/postfix/aliases 內是否有您剛才第 18 行 dialog 對話窗中輸入的 username 存在,若存在只取第一個 usernmae 即可,並寫入 $ALIASESUSER 暫存檔內。
  • 25 ~ 41:判斷該使用者帳號 LDAP,Aliases,Home Direcotry 是否有重複。
  • 43:跳出 dialog yes/no 對話窗,顯示剛才 18 行所輸入欲刪除的 LDAP User 資訊,若 25 ~ 41 判斷使用者不存在則顯示警告訊息。
  • 46:若第 43 行按下 yes 則開始執行 46 ~ 55行內容。
  • 47:刪除指定的 LDAP DN。
  • 48 ~ 51:刪除 Aliases 內該使用者帳號,並 Reload Aliases 使剛才的修改生效。
  • 52:刪除使用者家目錄。
  • 53:執行 slurpd One-shot 同步至 LDAP Slaver。
  • 55:刪除此 Shell Script 產生的暫存檔 /tmp/dialog.*。
  • 57:若第 43 行按下 no 後將不會執行任何動作並離開 dialog 對話窗。


參考

前言

本篇採訪 Clive 文章是 Debby 在2002年時所寫的,有感於 Clive 對於我在 FreeBSD 學習路上的幫助,之前看到這篇時就一直想收錄下來(不知為何有這樣強烈的念頭!!),經過與採訪作者 Debby 及 Clive 溝通後,採訪作者 Debby 同意讓我收錄此篇。非常感謝 Debby !!