linux下用源代码编译mysql(完整步骤)
首先,我们需要查看系统中现有的用户及用户组:
注意:本文中所有的命令均以root身份运行(既shell提示符为#),如果对linux系统不熟悉,在回车前一定要仔细核对。本文不对命令进行过多的讨论,除非有必要,仅给出需要的命令及参数解释。
grep -in mysql /etc/passwd /etc/group
执行上述命令,-i参数不区分大小写,如果你没有看到包含mysql的信息,则说明你的系统当前 可能 没有配置mysql,下面我们需要为mysql运行创建用户及组。如果你看到结果返回 mysql 的字样,说明mysql运行的帐户信息己建立好了,那么可以跳过下面这一步。
<!–more–>
groupadd -r -p mysql5 mysql
useradd -c “mysql daemon” -r -s /bin/false -d /var/lib/mysql -g mysql -p mysql5 mysql
上述参数解释如下(两个命令参数意义类似):
-c “mysql daemon” mysql用户的描述,如果描述包含多个字符,可以使用引号
-r 将 用户/组 设置为 系统用户/组
-s /bin/false 指定登录外壳,/bin/false为禁止用户从 终端/图形界面 登录
-d /var/lib/mysql,设置用户的主目录,/var/lib/mysql是默认设置,你也可以指定其他位置。
-g mysql 将用户加入到指定的组中。指定的组名必须是存在的。
-p mysql5 设置密码。本文仅是举例,你可以为用户和组各指定不同的密码。
我们是先创建组,然后再创建用户,并把用户加入到组中。如果是先创建用户,在没有指定 -n 参数的情况下,系统将自动创建与用户名同名的组,并且 组ID 与 用户ID 相同,这可能不是我们需要的结果,特别是个别系统有可能更改这一默认设置(如,新用户有默认组),从而带来一些问题,因此,为了避免不必要的麻烦,上述两个命令的顺序不要颠倒。
按下来我们开始对myslq进行编译,过程如下:
cd /local/localsoft/websrv/mysql/
tar xvf mysql-5.1.29-rc.tar.gz
cd mysql-5.1.29-rc/
./configure –help
首先查看一下configure 的参数,根据你的需要进行设置(编译时间约需10分钟)。
本例将mysql安装到默认的/usr/local目录下。优化编译的参数如下:
CFLAGS=”-O3 -mpentiumpro” CXX=gcc CXXFLAGS=”-O3 -mpentiumpro \
-felide-constructors -fno-exceptions -fno-rtti” ./configure \
–sysconfdir=/usr/local/etc \
–libexecdir=/usr/local/sbin \
–localstatedir=/var/lib/mysql \
–enable-assembler \
–with-charset=utf8 \
–with-collation=utf8_general_ci \
–with-extra-charsets=gbk,gb2312,binary \
–enable-thread-safe-client \
–enable-local-infile \
–with-pthread \
–with-plugin-innobase \
–without-bench \
–without-readline \
–with-mysqld-ldflags=-all-static \
–with-client-ldflags=-all-static &&
make testdir=/tmp/mysql &&make testdir=/tmp/mysql install
请仔细核对上述命令及参数,一些输入错误会被 configure脚本忽略,所以回车前一定要仔细检查。
通过&&可以将几个命令进行连接,保证上一个命令完成后才开始下一个命令。因此,如果你看到安装成功的提示,则说明mysql已正确编译并安装。这是检验命令正确运行的一个好方法。
本例使用了—sysconfdir=/usr/local/etc重新指定了my.cnf文件的位置,该文件是mysql主要的配置文件。如果你的系统中存有不同版本的my.cnf,那么使用这一参数重新指定my.cnf的位置防止冲突。
关于编译优化:在configure脚本之前执行是的优化参数,有关这些优化参数的解释,请自行查阅有关文章,在http://dev.mysql.com/网站上也有简略的介绍。本文介绍的方法优化得并不彻底,有些过于苛刻的优化对于程序性能的提升有限,反而会带来兼容性及程序运行不稳定等问题。
关于字符集:mysql支持几十种字符集,但是在中文环境下,许多字符集是根本不会用到的,但开启他们或多或少会对mysql有所消耗,因此,使用 –with-extra-charsets=gbk,gb2312,binary 来指定字符集可以在一定程度上提升程序的性能。
关于配置文件:mysql默认的配置文件为my.cnf,你可以使用如下命令复制配置文件并设置权限:
install -v -m 644 /usr/local/share/mysql/my-medium.cnf /usr/local/etc/my.cnf
mysql启动时会在以下几个位置寻找my.cnf:/etc/my.cnf,在编译mysql时使用—sysconfdir设置的my.cnf的位置,~/.my.cnf。my.cnf的存在不是必须的,即使mysql找不到my.cnf仍然可以启动,但是,如果mysql能够找到my.cnf,你必须保证my.cnf中的配置与你当前mysql的配置一致,否则mysql不能启动。另外,如果你愿意修改mysql.server(复制到/etc/init.d/目录下的启动脚本)中的设置,那么my.cnf中的一些设置如basedir,datadir等会被覆盖。
关于innodb:从mysql5.1版本开始,mysql默认关闭对innodb的支持,如果你的程序需要使用innodb,那么需要使用–with-plugin-innobase参数打开innodb支持。
关于federated存储引擎:在编译时使用—with-federated-storage-engine参数打开 federated 支持。注意,如果你没有打开federated引擎的支持,那么,在my.cnf配置文件中 skip-federated 这项参数就会变得没有意义。并且,因此会导致MySQL启动失败,你需要在my.cnf中注掉到 skip-federated 这一行,MySQL才能正常启动。
接下来我们需要对mysql进行初始化,包括,安装默认的数据库,添加mysql服务,以及对mysql的启动进行一系列的配置等工作,如果你此前没有进行创建mysql用户/组的工作,那么也可以在现在进行。
关于启动脚本:编译安装的mysql自带启动脚本,本例中这个脚本的位置在/usr/local/share/mysql/mysql.server文件,默认情况下,你不需要对这个文件进行修改。
安装默认数据库,拷贝服务并启动,同样是先给出命令,再进行解释:
cd /usr/local | 进入目录 |
bin/mysql_install_db –user=mysql | 安装默认数据库 |
cp share/mysql/my-medium.cnf /etc/my.cnf | 复制配置文件(可能需要适当修改) |
cp share/mysql/mysql.server /etc/init.d/mysqld | 复制mysql启动脚本 |
chmod 755 /etc/init.d/mysqld | 更改mysql启动脚本权限,执行权限必须 |
chkconfig –add mysqld | 添加mysql服务 |
chkconfig –level 35 mysqld on | 设置服务在运行级3,5启动 |
chkconfig –list mysqld | 显示mysql服务配置情况 |
cd /usr/local/sbin&&cp mysqld mysqld.old | 进入守护进程所在目录并备份该文件 |
strip mysqld | 删除调试符号,生成的二进制可以快4% |
service mysqld start | 启动服务 |
注意这里,如果你的mysql无法启动,请查看/var/lib/mysql目录下有一个扩展名为.err的文件,文件中会记录mysql无法启动的原因。请根据需要进行修改。
接下来我们需要进入mysql并root帐户设置密码:
/usr/local/bin/mysqladmin -uroot password mysql5 | 设置root帐户的密码 |
/usr/local/bin/mysql -uroot -p | 登录并输入密码,即上面设置的mysql5 |
mysql>use mysql; | 打开名为mysql的数据库 |
mysql>update user set password=password(’mysql5′) where user=’root’; |
为安全起见,为所有的root用户设置密码。 本例中密码为mysql5,你可以任意设定 |
mysql>delete from user where password=”"; | 删除用于本机匿名连接的空密码帐号 |
mysql>flush privileges; | 重新读授权表,否则用户权限不会更新 |
mysql>quit | 退出mysql |
mysql数据库启动后,在/var/lib/mysql目录下可以找到<主机名>.err的文件,记录了mysql首次运行的信息,正常情况下,该信息大概内容如下:
081223 00:55:32 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
081223 0:55:32 [Note] Event Scheduler: Loaded 0 events
081223 0:55:32 [Note] /usr/local/sbin/mysqld: ready for connections.
Version: ‘5.1.29-rc-log’ socket: ‘/tmp/mysql.sock’ port: 3306 Source distribution
tar xvf google-perftools-0.99.2.tar.gz
cd google-perftools-0.99.2/
./configure &&make &&make install
接下在,在mysql的编译参数中做适当的调整:
CFLAGS=”-O3 -mpentiumpro” CXX=g++ CXXFLAGS=”-O3 -mpentiumpro \
-felide-constructors -fno-exceptions -fno-rtti” ./configure \
–sysconfdir=/usr/local/etc \
–libexecdir=/usr/local/sbin \
–localstatedir=/var/lib/mysql \
–enable-assembler \
–with-charset=utf8 \
–with-collation=utf8_general_ci \
–with-extra-charsets=gbk,gb2312,binary \
–enable-thread-safe-client \
–enable-local-infile \
–with-pthread \
–with-plugin-innobase \
–without-bench \
–without-readline \
–with-mysqld-ldflags=”-all-static -ltcmalloc” \
–with-client-ldflags=-all-static &&
make testdir=/tmp/mysql &&make testdir=/tmp/mysql install
关于google-perftools:如果你使有64位系统,那么在编译google-perftools前,你需要首先安装libunwind库,十字的电脑是32位系统,因此不需要编译libunwind库,也没有进行尝试。