Linux (ubuntu 10.10) 安装两个MySQL
最近在实习的地方学到了很多,linux命令、shell、mysql等等。能在实际中使用已学的东西,并找到感兴趣的东西,是很美好的一件事。
闲话不扯,记录下这次解决的问题。
操作系统:ubuntu 10.10
需求:在当前主机安装两个mysql,使用不同的端口号进行访问,以便内部服务器测试使用
一开始在网上搜罗了半天,没头绪,看到有人说不必这么麻烦装两个mysql,只要生成两个实例(改改配置文件)就可以。不知道是自己笨还是哪里操作有问题,反正没成功,最后连数据库都进不去了。只能果断放弃。
之后搜到了两个网址,感觉蛮不错的,步骤清晰(但因为操作系统不同,所以稍微之后的操作有点不同),就直接试了下:
第一个看着更详细,我就按着那个来了~(这两个在执行./configure的时候,后面的参数都不适合我的配置,需要改进!)
第一个mysql之前就装好了,所以就去mysql官网下了个源码包(mysql 5.1.66),重新编译安装第二个mysql。
解压后执行./configure,出了个错误:configure: error: No curses/termcap library found
百度之后发现是缺少libncurses造成的,于是果断apt之:apt-get install libncurses5-dev,网上还有个方法是通过安装g++搞定的,没试过,在这里仅供记录。
本以为./configure make && make install 一路顺利之后就可以搞定了,天不随人意呐(ㄒoㄒ)//,打开第二个mysql服务(我命之为mysql5)的时候,又出错了Q_Q
...... * Manager of pid-file quit without updating file.
查了好久,百度了好久(其实那天下午基本上就是在解决这个问题o(-"-)o),发现可能是./configure的时候没把参数陪对,天杀的,只能把变编译、安装好的给卸载掉了╯﹏╰
进到configue所在目录,执行:make uninstall && make clean,然后重新configure:
./configure --prefix=/usr/local/mysql5 --with-comment=Source --with-mysqld-user=mysql --without-debug --without-bench --enable-thread-safe-client --enable-assembler --enable-profiling --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=utf8 --with-plugin-innobase --without-embedded-server --with-server-suffix=-ubuntu --enable-local-infile --with-unix-socket-path=/tmp/mysql5.sock --localstatedir=/var/lib/mysql5
说明下:这个mysql我安装在/usr/local/mysql5下;字符集因为需要改成了utf-8的;去掉了ACCP5200和hj2333中都有的一项:--with-plugin=all;服务器的名字:--with-server-suffix=-ubuntu;socket路径(这个一定要设置对,要记住!!):--with-unix-socket-path=/tmp/mysql5.sock;数据库的文保存在:/var/lib/mysql5
等了好几分钟,终于编译安装好了\(^o^)/
运行:service mysql5 start,没报错!!只不过显示得不太正常:
Starting MySQL
. *
不像第一个mysql,启动服务的时候会显示:mysql start/running, process 3697
不管了,反正是好了(好了?真的好了?悲剧由此开始。。)
进入mysql5一看,傻眼了,还是第一个mysql中的表,本来想运行第一个mysql看看的,结果运行不起来。用ps axf | grep mysql查看了下,发现有一行命令很奇怪:
3605 pts/0 Sl 0:02 \_ /usr/local/mysql5/libexec/mysqld --defaults-file=/etc/mysql5/my5.cnf --basedir=/usr/local/mysql --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/xxx.err --pid-file=/var/lib/mysql/xxx.pid --socket=/tmp/mysql5.sock --port=3307
我指定的datadir明明是/var/lib/mysql5为什么就变成/var/lib/mysql了呢(这个文件夹存的mysql中的数据库信息,而不是我那mysql5的),问题很可能就在这。不过,鉴于时间的原因(当时已经20:30分多了,赶回学校需要2个小时,最快也要1个半小时,作为一个实习生,我也算敬业了吧◑﹏◐),只好匆匆收拾一下就回去了。
第二天,来了之后在mysql5的启动脚本上做了点手脚:-P,在开头的地方添加了句:trap 'echo -n "$LINENO"' DEBUG,然后用bash打开调试模式:bash -x /etc/init.d/mysql5,查看问题到底在哪里。扫了一眼,parse_server_arguments 的调用处指定的datadir变成了/var/lib/mysql而不是我在该脚本开头设定的datadir=/var/lib/mysql5,追着parse_server_arguments的踪迹,找到了这么行代码:parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`。问题就在这里了!经过两三次测试发现是由于parse_server_arguments这个函数把我设的datadir改掉的(当时是修改了mysqld这个参数,导致$print_defaults(该变量引用了/usr/local/mysql5/bin/my_print_defaults这个程序)不能正常返回值,所以parse_server_arguments这个函数没有修改我设的参数。果断注释掉这条语句,之后重启了下mysql5:service mysql5 start,然后试着进入:mysql -uroot -p --socket=/tmp/mysql5.sock,能进去!查看了下数据库,是个新的!!感动ing~然后试着打开第一个mysql,也能正常访问。至此,终于告一段落了~\(≧▽≦)/~
经过这么一弄,大致对mysql的启动过程有了感性的了解,不枉此行了~~
下面把操作过程罗列一下:
1.安装数据库:
tar -zxvf mysql-5.1.66.tar.gz
cd mysql-5.1.66
mkdir /usr/local/mysql5
./configure --prefix=/usr/local/mysql5 --with-comment=Source --with-mysqld-user=mysql --without-debug --without-bench --enable-thread-safe-client --enable-assembler --enable-profiling --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=utf8 --with-plugin-innobase --without-embedded-server --with-server-suffix=-ubuntu --enable-local-infile --with-unix-socket-path=/tmp/mysql5.sock --localstatedir=/var/lib/mysql5
#(若出现configure: error: No curses/termcap library found,执行:apt-get install libncurses5-dev)
make && make install
2.初始化数据库并授权:
#(ll /var/lib/mysql5 看看有没有产生这个目录,没有就新建一个mkdir /var/lib/mysql5)
/usr/local/mysql5/bin/mysql_install_db
cd /usr/local/mysql5
chown -R mysql:mysql .
chown -R mysql:mysql /var/lib/mysql5
chgrp -R mysql .
3.复制配置文件,并添加自启动脚本:
cp share/mysql/my-small.cnf /etc/mysql5/my5.cnf
cp share/mysql/mysql.server /etc/init.d/mysql5
chmod 755 /etc/init.d/mysql5
4.搜索并修改启动脚本/etc/init.d/mysql5:
1)datadir=/var/lib/mysql5
2)conf=/etc/mysql5/my5.cnf
3)把$bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &替换为:
$bindir/mysqld_safe --defaults-file=/etc/mysql5/my5.cnf --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &
* 4)如果不能正常启动则把下面这句注释掉(前面加个#):
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
5.保存退出并添加服务:
chkconfig --add mysql5
6.修改配置文件/etc/mysql5/my5.cnf([client] 和 [mysqld]里的都要改):
#改成自己指定的端口
port = 3307
#更改socket
socket = /tmp/mysql5.sock
#出问题的话,添加个datadir
datadir = /var/lib/mysql5
7.重启服务:
service mysql5 start
8.检查是否启动成功:
ps axf | grep mysql
若这一项(/usr/local/mysql5/libexec/mysqld),后面的参数正确:--defaults-file=/etc/mysql5/my5.cnf --basedir=/usr/local/mysql5 --datadir=/var/lib/mysql5 --socket=/tmp/mysql5.sock --port=3307
都指向mysql5而不是mysql的话就应该是对了
9.修改密码:
mysqladmin -uroot password '你的密码'
10.测试登陆(要指定socket,否则会使用默认的第一个mysql的数据库):
mysql -uroot -p你的密码 --socket=/tmp/mysql5.sock