转载

最近的几个技术问题总结和答疑

    笔记写了不少,有时候有的朋友问我几个关键字,我就会从脑海里进行搜索,凡是写过的,搜索一下总能找到,帮助了别人,提高了自己,何乐而不为。
    但是笔记写了很多,如果不加以改进,那么进步还是很小的,尤其比较怕的就是如果写出了问题的解决方案,但是这个解决方案是非主流的方式,可能有一些潜在风险的,如果误导了读者,那就是罪过了。所以有时候想集中纠正一下。而且有时候看看以前写的文章,有时候会发现有一些分析思路可能在经历了大批量的故障处理之后,思路可能会更开阔,这些其实也可以改进改进。
    写笔记能坚持到现在不容易,让我的笔记更有意义,帮助到别人,别误导人,这是我的初衷。
    首先我准备先来做一些笔记的改进。
    运维平台的建设思考-元数据管理(四)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)
正文到此结束
Loading...