by Weithenn on 星期四, 2月 19, 2009
1、前言
What is Blastwave.org ? 簡單來說 Blastwave 就是幫您把自由軟體收集起來讓 x86 及 Sparc 使用者容易安裝套件只要打 pkg-get install 套件名稱 就可清鬆安裝套件了;使用 pkg-get 安裝的套件開頭名稱為 CSW (Community Software for Solaris)。
by Weithenn on 星期四, 2月 12, 2009
前言
當 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 資料流程說明
- 先判斷備份 LDAP LDIF 資料夾只留備份日期距離目前最新的 90 個資料夾。
- 將 SLAPD database to LDIF utility。
- 匯出 LDAP Database 內容 LDIF 檔。
還原 LDAP LDIF 資料流程說明
- 停止 slapd 服務 (停止資料寫入)。
- 將先前備份的 LDIF 資料複製到本機下。
- 匯入 LDAP LDIF 檔。
- 啟動 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 檔案】
by Weithenn on 星期四, 2月 12, 2009
前言
當 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 資料庫流程說明
- 先判斷備份 LDAP BDB 資料夾只留備份日期距離目前最新的 90 個資料夾。
- 停止 slapd 服務 (停止資料寫入)。
- 執行 db_checkpoint 確保資料都寫入 LDAP BDB 資料庫中。
- 複製所有資料庫檔案 (*.bdb) 至備份伺服器。
- 複製所有資料庫 Log(log.*) 至備份伺服器。
- 啟動 slapd 服務。
還原 LDAP BDB 資料庫流程說明
- 停止 slapd 服務 (停止資料寫入)。
- 將先前備份的(*.bdb,log.*******) 複製到 /var/db/openldap-data。
- 執行 db_recover 還原資料庫。
- 啟動 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 服務
by Weithenn on 星期四, 2月 12, 2009
1、前言
當 MySQL 上線服務前第一個要思考的問題當然就是災難復原了,預計讓系統每天凌晨自動備份 MySQL 使用 HotCopy 備份方式,之後使用 Rsync 方式將遠端備份好的 MySQL HotCopy 檔案同步回來,並透過 amd (automounter daemon) mount 方式將 MySQL HotCopy 備份資料寫入至備份伺服器中 (遠端路徑使用 /host/機器名稱),當然前提是你已經設好管理 MySQL 帳號及密碼在 /etc/my.cnf 檔案內。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。備份 MySQL DB 流程說明:
- 遠端 MySQL Server 每天定期執行 sqlcopy.sh 來備份 MySQL 資料庫。
- 只保留最新 3 天的備份 MySQL Database 資料夾。
- 本地端的機器每天定期將遠端 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、參考
- Duncan Lo MySQL簡易備份方法
- 如何才能实现MySQL的自动备份 - 技术应用子站 - 赛迪网
- MySQL AB :: MySQL 5.0 Reference Manual :: 8.14 mysqlhotcopy — A Database Backup Program
- MySQL Bugs: #27303: mysqlhotcopy dies with error Invalid db.table name 'foo.bar`.`baz'
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 //可發現有此指令了
by Weithenn on 星期四, 2月 12, 2009
前言
當 MySQL 上線服務前第一個要思考的問題當然就是災難復原了,預計讓系統每天凌晨自動備份 MySQL 使用 Dump 備份方式,之後使用 Rsync 方式將遠端備份好的 MySQL Dump 檔案同步回來,並透過 amd (automounter daemon) mount 方式將 MySQL Dump 備份資料寫入至備份伺服器中 (遠端路徑使用/host/機器名稱),當然前提是你已經設好管理 MySQL 帳號及密碼在 /etc/my.cnf 檔案內。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。備份 MySQL DB 流程說明:
- 遠端 MySQL Server 每天定期執行 sqldump.sh 來備份 MySQL 資料庫。
- 只保留最新 3 天的備份 MySQL Database 資料夾。
- 本地端的機器每天定期將遠端 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:開始執行同步。
參考
- Duncan Lo MySQL簡易備份方法
- 如何才能实现MySQL的自动备份 - 技术应用子站 - 赛迪网
- MySQL AB :: MySQL 5.0 Reference Manual :: 8.14 mysqlhotcopy — A Database Backup Program
- MySQL Bugs: #27303: mysqlhotcopy dies with error Invalid db.table name 'foo.bar`.`baz'
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 的徵狀。
- 並沒有看到 vote_results table。
- 但使用指令 show tables; 卻有看到 vote_results table。
- 使用 drop table vote_results 又說該 table 不存在無法 drop。
- 至 mysql 目錄下有看到 vote_results.frm 檔案。
反正這也只是投票的結果而以,就把 vote_results.frm 檔案拿掉,並重新啟動 mysqld 後,就可順利執行 mysqldump 了。
by Weithenn on 星期二, 2月 10, 2009
前言
繼上一篇 OpenLDAP-ldapadduser.sh Script,我們利用 Script 來簡化當有新進同仁加入時建帳號的過程,相對的當有同仁離職時我們也是要手動下一堆指令來處理 (ex. 刪除該帳號加到所屬的 Mail Aliases...etc),因此開始寫下面的 script 了。請注意:以下 Script 只適合我的環境,若您取用請自行調整,恕不負損壞之責。rmuser_ldap.sh 達成如下需求:
- 刪除 user dn 資料。
- 刪除 user 家目錄及 (含 Maildir)。
- 刪除 user 在 Mail Aliases 內 Reload Aliases。
- 執行 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 對話窗。
參考
訂閱:
文章 (Atom)