MariaDB启动脚本/etc/init.d/mysql的坑|一直 .........

2018-03-30 22:50:18  阅读 61 次 评论 0 条

  最近想把公司的mysql5.5.43迁到mariadb10.0.21上,就在测试环境上搞了一把,具体步骤就不谈了,还是蛮简单的~但是到最后启动mariadb的时候踩到坑了~

具体情况如下:


      从启动界面来看MariaDB启动不起?!!查看进程看下:


     发现mysql进程已经起来了,但是不知道什么原因给hang住了,不停的循环,再查看我的日志和端口


[html] view plain copy
  1. 150924 16:57:51 mysqld_safe mysqld from pid file /data/mysql/data/mariadb.pid ended  

  2. 150924 16:57:54 mysqld_safe Starting mysqld daemon with databases from /data/mysql/data  

  3. 150924 16:57:54 [Note] /usr/sbin/mysqld (mysqld 10.0.21-MariaDB-log) starting as process 11356 ...  

  4. 150924 16:57:54 [Note] InnoDB: Using mutexes to ref count buffer pool pages  

  5. 150924 16:57:54 [Note] InnoDB: The InnoDB memory heap is disabled  

  6. 150924 16:57:54 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins  

  7. 150924 16:57:54 [Note] InnoDB: Memory barrier is not used  

  8. 150924 16:57:54 [Note] InnoDB: Compressed tables use zlib 1.2.3  

  9. 150924 16:57:54 [Note] InnoDB: Using Linux native AIO  

  10. 150924 16:57:54 [Note] InnoDB: Using CPU crc32 instructions  

  11. 150924 16:57:54 [Note] InnoDB: Initializing buffer pool, size = 128.0M  

  12. 150924 16:57:54 [Note] InnoDB: Completed initialization of buffer pool  

  13. 150924 16:57:54 [Note] InnoDB: Highest supported file format is Barracuda.  

  14. 150924 16:57:54 [Note] InnoDB: 128 rollback segment(s) are active.  

  15. 150924 16:57:54 [Note] InnoDB: Waiting for purge to start  

  16. 150924 16:57:54 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.25-73.1 started; log sequence number 1616817  

  17. 150924 16:57:54 [Note] Plugin 'FEEDBACK' is disabled.  

  18. 150924 16:57:54 [Note] Server socket created on IP: '::'.  

  19. 150924 16:57:54 [Warning] 'user' entry 'root@mariadb' ignored in --skip-name-resolve mode.  

  20. 150924 16:57:54 [Warning] 'proxies_priv' entry '@% root@mariadb' ignored in --skip-name-resolve mode.  

  21. 150924 16:57:54 [Note] Event Scheduler: Loaded 0 events  

  22. 150924 16:57:54 [Note] /usr/sbin/mysqld: ready for connections.  

  23. Version: '10.0.21-MariaDB-log'  socket: '/data/mysql/mysql.sock'  port: 3306  MariaDB Server  

  24. 150924 16:57:54 [Note] Event Scheduler: scheduler thread started with id 2  


连接数据库什么的都是正常的~这样的话就把疑点转移到了/etc/init.d/mysql启动脚本上了,到底是什么原因将启动进程循环的呢?


查看MariaDB10.0.21的mysql脚本发现在启动的时候会调用函数wait_for_ready


[html] view plain copy
  1. case "$mode" in  

  2.   'start')  

  3.     # Start daemon  

  4.   

  5.   

  6.     # Start daemon  

  7.   

  8.     # Safeguard (relative paths, core dumps..)  

  9.     cd $basedir  

  10.   

  11.     echo $echo_n "Starting MySQL"  

  12.     if test -x $bindir/mysqld_safe  

  13.     then  

  14.       # Give extra arguments to mysqld with the my.cnf file. This script  

  15.       # may be overwritten at next upgrade.  

  16.       $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &  

  17.       wait_for_ready; return_value=$?  

  18.   

  19.       # Make lock for RedHat / SuSE  

  20.       if test -w "$lockdir"  

  21.       then  

  22.         touch "$lock_file_path"  

  23.       fi  

  24.   

  25.       exit $return_value  

  26.     else  

  27.       log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"  

  28.     fi  

  29.     ;;  

然后再查看wait_for_ready函数咋写的呢?



[html] view plain copy
  1. wait_for_ready () {  

  2.   

  3.   i=0  

  4.   while test $i -ne $service_startup_timeout ; do  

  5.   

  6.   i=0  

  7.   while test $i -ne $service_startup_timeout ; do  

  8.   

  9.     if $bindir/mysqladmin ping >/dev/null 2>&1; then  

  10.           log_success_msg  

  11.       return 0  

  12.     elif kill -0 $! 2>/dev/null ; then  

  13.       :  # mysqld_safe is still running  

  14.     else  

  15.       # mysqld_safe is no longer running, abort the wait loop  

  16.       break  

  17.     fi  

  18.   

  19.     echo $echo_n ".$echo_c"  

  20.     i=`expr $i + 1`  

  21.     sleep 1  

  22.   

  23.   done  

  24.   

  25.   log_failure_msg  

  26.   return 1  

  27. }  

看到只有当mysqladmin ping命令通过的时候才会返回success,其他情况只会不停的循环.然后900秒后报错退出,但是mysql实际上是已经起来了的。



知道了原因,这里面有两种解决方法

1)在/etc/my.cnf中设置mysqladmin的用户名,密码和socket路径

2)修改mysql启动脚本

这里我采用的是修改mysql启动脚本,怕密码泄露啊!参照mysql5.5中的check方式,check一下pid文件就ok了


[html] view plain copy
  1. wait_for_ready () {  

  2.   

  3.   i=0  

  4.   while test $i -ne $service_startup_timeout ; do  

  5.   

  6.     #if $bindir/mysqladmin ping >/dev/null 2>&1; then  

  7.     if test -e $mysqld_pid_file_path;then  

  8.       log_success_msg  

  9.       return 0  

  10.     elif kill -0 $! 2>/dev/null ; then  

  11.       :  # mysqld_safe is still running  

  12.     else  

  13.       # mysqld_safe is no longer running, abort the wait loop  

  14.       break  

  15.     fi  

  16.   

  17.     echo $echo_n ".$echo_c"  

  18.     i=`expr $i + 1`  

  19.     sleep 1  

  20.   

  21.   done  

  22.   

  23.   log_failure_msg  

  24.   return 1  

  25. }  

然后启动搞定!



本文地址:http://blog.ailinux.net/post/50.html
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?