最近的幾個技術問題總結和答疑

dbhelper發表於2016-02-25
    筆記寫了不少,有時候有的朋友問我幾個關鍵字,我就會從腦海裡進行搜尋,凡是寫過的,搜尋一下總能找到,幫助了別人,提高了自己,何樂而不為。
    但是筆記寫了很多,如果不加以改進,那麼進步還是很小的,尤其比較怕的就是如果寫出了問題的解決方案,但是這個解決方案是非主流的方式,可能有一些潛在風險的,如果誤導了讀者,那就是罪過了。所以有時候想集中糾正一下。而且有時候看看以前寫的文章,有時候會發現有一些分析思路可能在經歷了大批次的故障處理之後,思路可能會更開闊,這些其實也可以改進改進。
    寫筆記能堅持到現在不容易,讓我的筆記更有意義,幫助到別人,別誤導人,這是我的初衷。
    首先我準備先來做一些筆記的改進。
    運維平臺的建設思考-後設資料管理(四)http://blog.itpub.net/23718752/viewspace-1992768/
這篇有些朋友說很實用,不過這些定製指令碼的優點還在於可以改進完善,所以在這之後繼續改進,發現了幾個小問題。一併列出來。
    對於磁碟空間的使用情況的分析
原來的指令碼內容為:
df -hT|egrep -v 'Filesystem|/dev/shm'|while read line; do echo -e "`echo $line|awk '{print $7}'`:`echo $line|awk '{print $5}'`:`echo $line|awk '{print $6}'`"; done > /tmp/tmpdisk
cat /tmp/tmpdisk|while read line
do
  if [ `echo $line|awk -F':' '{print $3}'|sed 's/%//g'` -lt 85 ] ; then
    tmpline=`echo $line|sed 's/\///g'`
    sed -i "/$tmpline/d" /tmp/tmpdisk
  fi
done
if [ -s /tmp/tmpdisk ] ; then
  DISK_STAT=`cat /tmp/tmpdisk|sed -e ":a;N;s/\n/,/;ta"`
else
  DISK_STAT='OK'
fi
rm -f /tmp/tmpdisk
但是在大批次的檢測中,發現還是有一些問題。對於一些分割槽,如果名字長一些,會序列,所以可以使用df -hTP來顯示到一行中
在顯示結果中,如果某個分割槽名過長,還有特殊字元,會有一些處理上的不足,比如下面這個是原先指令碼過濾後的結果。
/opt:109G:86%,/home/oracle/backup_stage/192.168.1.24_extradb:1.1T:71%
按照預期,應該只顯示/opt:109G 即可。所以這個部分做了改進。

改進之後的指令碼內容為:
function check_df
{
df -hTP|egrep -v 'Filesystem|/dev/shm'|while read line; do echo -e "`echo $line|awk '{print $7}'`:`echo $line|awk '{print $5}'`:`echo $line|awk '{print $6}'`"; done > /tmp/tmpdisk
cat /tmp/tmpdisk|while read line
do
  if [ `echo $line|awk -F':' '{print $3}'|sed 's/%//g'` -gt 85 ] ; then
    tmp_var=$line
    tmpline=$line
    echo $tmpline
  fi
done |sed -e ":a;N;s/\n/,/;ta"
}
DISK_STAT=`check_df`

在原來的基礎上,增加了資料庫版本的統計,這個思路不能按照ORACLE_HOME的來算,我的一個切入點就是以sqlplus -v的結果為準,檢查配置的變數的方式還是有些不妥當。
得到oracle版本的思路是檢查/etc/oratab中,得到ORACLE_HOME的值,然後呼叫sqlplus -v來得到最終的版本。
export ORACLE_HOME=`cat /etc/oratab | tail -1 | awk -F: '{print $2}'`
ORA_VER=`$ORACLE_HOME/bin/sqlplus -v|awk '{print $3}'`

然後再說說另外一篇筆記。
MySQL遷移檔案的小問題 http://blog.itpub.net/23718752/
對於文章中的從庫檔案遷移,當時是使用reset slave的方式解決的,但是也有一些朋友做了更多的建議,啟榮兄給了我一個解決的方向,對於這類的檔案遷移,其實大可不必使用reset slave,這種方式還是有些太"暴力“,影響比較大。完全可以很優雅的完成。改改配置,重啟一下即可。
停庫之後修改my.cnf,修改裡面相關的路徑設定。
# /etc/init.d/mysql stop
Shutting down MySQL (Percona Server)... SUCCESS!

vi /etc/my.cnf
然後遷移檔案,作業系統命令級即可搞定。
# mv mysql_test/* mysql_3306
啟動資料庫,當然這個時候肯定會報錯。
# /etc/init.d/mysql start
Starting MySQL (Percona Server)..... ERROR! The server quit without updating PID file (/U01/app/mysql_3306/mysql.pid).
主要原因是這個時候校驗的是binlog的index檔案,裡面的路徑對應不上,所以在日誌裡會提示找不到。修改一下即可。
# vi bin-index.index
/U01/app/mysql_3306/mysql-bin.000001
/U01/app/mysql_3306/mysql-bin.000002
/U01/app/mysql_3306/mysql-bin.000003
/U01/app/mysql_3306/mysql-bin.000004
/U01/app/mysql_3306/mysql-bin.000005
/U01/app/mysql_3306/mysql-bin.000006
/U01/app/mysql_3306/mysql-bin.000007
/U01/app/mysql_3306/mysql-bin.000008
/U01/app/mysql_3306/mysql-bin.000009
修改之後再次啟動就沒有問題了。
# /etc/init.d/mysql start
Starting MySQL (Percona Server)... SUCCESS!
這個時候啟動slave還是會報錯的
> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
而原因就在於relay-index.index和relay-log裡面的檔案路徑對應不上。
錯誤日誌大體是下面的樣子:
2016-02-24 14:59:18 3962 [Note] Server socket created on IP: '::'.
2016-02-24 14:59:18 3962 [ERROR] /usr/sbin/mysqld: File '/U01/app/mysql_test/mysql-relay.000006' not found (Errcode: 2 - No such file or directory)
2016-02-24 14:59:18 3962 [ERROR] Failed to open log (file '/U01/app/mysql_test/mysql-relay.000006', errno 2)
2016-02-24 14:59:18 3962 [ERROR] Could not open log file
2016-02-24 14:59:18 3962 [ERROR] /usr/sbin/mysqld: File '/U01/app/mysql_test/mysql-relay.000005' not found (Errcode: 2 - No such file or directory)
2016-02-24 14:59:18 3962 [ERROR] Failed to open log (file '/U01/app/mysql_test/mysql-relay.000005', errno 2)
2016-02-24 14:59:18 3962 [ERROR] Could not open log file
2016-02-24 14:59:18 3962 [ERROR] /usr/sbin/mysqld: File '/U01/app/mysql_test/mysql-relay.000006' not found (Errcode: 2 - No such file or directory)
2016-02-24 14:59:18 3962 [ERROR] Failed to open log (file '/U01/app/mysql_test/mysql-relay.000006', errno 2)
2016-02-24 14:59:18 3962 [ERROR] Failed to open the relay log '/U01/app/mysql_test/mysql-relay.000006' (relay_log_pos 2599866).
當然可以手工修改,但是實際上是沒有起作用的
# vi relay-index.index
/U01/app/mysql_test/mysql-relay.000005
/U01/app/mysql_test/mysql-relay.000006
/U01/app/mysql_3306/mysql-relay.000007
> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
mob_vesta_jingmao [(none)] [15:00:47]>
需要重啟才可以。所以由此可以得出,需要同時修改binlog和relay的設定,一次啟動就可以搞定了。
修改完成之後,一次重啟即可搞定。
# /etc/init.d/mysql start
Starting MySQL (Percona Server)... SUCCESS!
> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1994327/,如需轉載,請註明出處,否則將追究法律責任。

相關文章