+ -
当前位置:首页 → 问答吧 → 如何复制没有权限的文件加。mysql的data文件夹不能复制

如何复制没有权限的文件加。mysql的data文件夹不能复制

时间:2010-05-06

来源:互联网

操作系统 ubuntu-10.04-server-amd64
安装完lamp server后。
测试mysql可以正常重启等。
故障重现步骤
1、使用mysql自带配置文件,提升mysql性能
代码:
     sudo cp /usr/share/doc/mysql-server-5.1/examples/my-large.cnf.gz /etc/mysql/
     cd /etc/mysql/
     sudo gzip -d my-large.cnf.gz
     sudo cp my.cnf my.cnf.bk
     sudo service mysql restart //确认mysql还活着
     mysql -u root -p           //真的活着,然后退出crtl+d
     sudo cp my-large.cnf my.cnf
     sudo service mysql stop
     sudo service mysql start   //悲剧了。

2、尝试恢复my.cnf
代码:
     sudo cp my.cnf.bk my.cnf
     sudo service mysql start   //依旧悲剧,mysql再也启动不起来了(无任何mysql相关错误日志),可使用mysqld_safe启动。

后来发现问题主要出在my-large.cnf中需要添加一条参数
代码:
   [mysqld]
    user            = mysql

若在重启mysql前加上了这条则,一切太平。没有加就重启服务的话。。。那就悲剧了。。感觉这个问题出在mysql的启动脚本里。现在还没找到解决的办法,有兄弟能提供些解决的线索吗?

作者: zhuwz   发布时间: 2010-05-06

不可能没日志的,看/var/log/mysql下的日志

作者: kamui0523   发布时间: 2010-05-06

这个我看过了,还有syslog和message都看过了。其实问题不是mysql没启动,我觉得是在mysql服务启动的脚本中根本没运行到启动mysql那一步就卡死了。应该是新的服务管理造成的,我用mysqld_safe是能启动的也能产生日志。日志应该是运行了mysqld守护进程的时候才会记录,我是这么判断的。

作者: zhuwz   发布时间: 2010-05-07

大家可以按照我上面的步骤在虚拟机中作个测试,我的重现率是100%。
在init.d中的mysql启动项和早期的版本不一样了。(文件的时间是由于我手工编辑了脚本想echo点信息出来导致时间变更,在故障前后这个脚本没有变动)
代码:
/etc/init.d$ ls -l|grep mysql
lrwxrwxrwx 1 root root   21 2010-05-06 22:38 mysql -> /lib/init/upstart-job

实际的启动配置文件好像变成了下面这个。
/etc/init/mysql.conf
文件内容如下(该文件在启动前后也无变动)
代码:
#################
# MySQL Service

description     "MySQL Server"
author          "Mario Limonciello <[email protected]>"

start on (net-device-up
          and local-filesystems)
stop on runlevel [016]

respawn

env HOME=/etc/mysql
umask 007

pre-start script
    #Sanity checks
    [ -r $HOME/my.cnf ]
    [ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
    LC_ALL=C BLOCKSIZE= df --portability /var/lib/mysql/. | tail -n 1 | awk '{ exit ($4<4096) }'
end script

exec /usr/sbin/mysqld

post-start script
    while ! /usr/bin/mysqladmin --defaults-file=$HOME/debian.cnf ping
    do
        sleep 1
    done
    exec $HOME/debian-start
end script
###############################





/etc/mysql$ ls -l|grep debian-start
-rwxr-xr-x 1 root root 1198 2010-04-14 01:04 debian-start
/etc/mysql/debian-start文件如下(又包含了/usr/share/mysql/debian-start.inc.sh)
代码:
###################################
#!/bin/bash
#
# This script is executed by "/etc/init.d/mysql" on every (re)start.
#
# Changes to this file will be preserved when updating the Debian package.
#

source /usr/share/mysql/debian-start.inc.sh

MYSQL="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf"
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
MYUPGRADE="/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf"
MYCHECK="/usr/bin/mysqlcheck --defaults-file=/etc/mysql/debian.cnf"
MYCHECK_SUBJECT="WARNING: mysqlcheck has found corrupt tables"
MYCHECK_PARAMS="--all-databases --fast --silent"
MYCHECK_RCPT="root"

# The following commands should be run when the server is up but in background
# where they do not block the server start and in one shell instance so that
# they run sequentially. They are supposed not to echo anything to stdout.
# If you want to disable the check for crashed tables comment
# "check_for_crashed_tables" out. 
# (There may be no output to stdout inside the background process!)
echo "Checking for corrupt, not cleanly closed and upgrade needing tables."
(
  upgrade_system_tables_if_necessary;
  check_root_accounts;
  check_for_crashed_tables;
) >&2 &

exit 0
####################################

查看了/var/run/mysqld、/var/run。也没有sock文件和pid文件。
运行
代码:
/etc/mysql$ sudo service mysql status
mysql respawn/post-start, (post-start) process 1010


代码:
ps -aux|grep 1010
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
root      1010  0.3  0.1   4088   588 ?        Ss   17:41   0:00 /bin/sh -e /proc/self/fd/11
steam     1110  0.0  0.1   7616   904 pts/0    S+   17:41   0:00 grep --color=auto 1010


感觉是由于使用了错误的帐号启动了mysql服务导致服务启动过程出错,在添加了user=mysql参数后,也无法再次成功启动了。这个让我很诧异。启动脚本均未受变动。/var/lib/mysql中似乎也没异常出现。
如果这个是服务mysql服务脚本的问题的话还好。若是服务管理本身的问题。。那么很多其他服务应该也会遇到相关问题的。

最后由 zhuwz 编辑于 2010-05-07 9:47,总共编辑了 1 次

作者: zhuwz   发布时间: 2010-05-07

我直接物理机试了下,是起不来,还原my.cnf后
用/etc/init.d/mysql status,杀掉显示的进程就可以重启mysql了
用diff对比了下my.cnf和my-large.cnf,有很多出入,不过我对mysql没什么特殊要求,你有兴趣自己研究把,呵呵
另外linux不存在悲剧的事情,大部分情况都是可以修复的.

作者: kamui0523   发布时间: 2010-05-07

你那里mysql能启动了? 0 0
恩也正在试着看,其实my-large.cnf中只要添加user=mysql这个参数后,mysql就不会出现错误了。出现错误的原因应该还是使用错误的用户启动过一次服务。我即使手工kill掉那个进程,虽然mysql status显示running了。但是实际还是没有mysqld这个进程存在,mysql无法登录。

作者: zhuwz   发布时间: 2010-05-07

kill掉进程后应该显示stop,而不是running,我刚才又试了2次,my-large.cnf后启动失败,还原my.cnf重启也失败,同样日志中无任何报错,只有exit返回1的错误.
/etc/init.d/mysql status后杀掉显示的进程,重启成功
再不行你把ps -ef中显示的mysql进程也杀掉

作者: kamui0523   发布时间: 2010-05-07

谢谢,我在添加了user=mysql后kill掉进程就启动mysql了。不添加这条,kill掉后自动又会新建一个启动脚本进程。我再看看问题出在哪里。

作者: zhuwz   发布时间: 2010-05-07

我也想知道问题出在那里,为什么没有下文了。

作者: Ulinux-Future   发布时间: 2010-07-05

期待更新。。。

作者: xuwu125   发布时间: 2010-07-05

问题就是user=mysql 没有加
在以前的ubuntu server不加也可以启动。10.04不加就无法启动了。必须以mysql用户启动mysqld

作者: zhuwz   发布时间: 2010-07-09