因为工做和学习方面的缘由,常用linux,前段时间折腾了几回linux上源代码方式安装mysql,期间也参考了网友的各类介绍,如今总结以下,方便本身之后查看,也方便其余人学习使用。mysql
linux:CentOS 6.5/6.3 x86/x86_64均实验过linux
这里进行介绍所须要的软件或工具版本有:c++
MySQL:mysql-5.5.37.tar.gz,cmake:cmake-2.8.12.2.tar.gzsql
这些均可以到相应的官网下载,版本可有可无,重要的是过程和方法。shell
还要为linux安装gcc和gcc-c++以及ncurses-devel和由此产生的依赖,直接使用yum进行安装数据库
yum install gcc gcc-c++ ncurses-devel
安装完后就能够进行正式的安装了。缓存
将下载好的cmake-2.8.12.2.tar.gz上传到linux上,而后解包服务器
tar -zxvf cmake-2.8.12.2.tar.gz
进入解压出来的目录,而后按照要求运行安装命令(中间可能要等一下子)tcp
cd cmake-2.8.12.2 ./boostrap make make install
这样就把cmake装好了,以后就能够安装MySQL了。ide
groupadd mysql useradd -g mysql mysql cd /usr/local mkdir mysql cd mysql mkdir data mkdir log cd .. chown -R mysql:mysql mysql
这样就建立了mysql的用户和用户组,也建立了安装的相关目录。这里的目录能够修改,可是要和接下来的安装配置相对应。
将下载的mysql-5.5.37.tar.gz上传到linux上,解压缩包
tar -zxvf mysql-5.5.37.tar.gz
进入源代码目录
cd mysql-5.5.37
使用cmake配置编译文件
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DENABLED_LOCAL_INFILE=1
这里面的目录要和以前准备的目录关联,若是提示出错的话还要删除cmake的缓存文件,修正错误,而后从新配置。
配置成功后就能够编译安装了,中间要等一段时间
make make install
修改文件权限
chmod +w /usr/local/mysql/ chown -R mysql:mysql /usr/local/mysql/
查看连接库的状况
ls /usr/local/mysql/lib
输出多是这个样子的
libmysqlclient.a libmysqlclient_r.so.18.0.0 libmysqlservices.a libmysqlclient_r.a libmysqlclient.so plugin libmysqlclient_r.so libmysqlclient.so.18 libmysqlclient_r.so.18 libmysqlclient.so.18.0.0
要建立一个连接文件,若是具体的输出不同,对应更改
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
进入源代码目录下面的配置文件目录
cd support-files/
复制相关配置文件
cp my-small.cnf /etc/my.cnf cp mysql.server /etc/rc.d/init.d/mysql
初始化安装,
/usr/local/mysql/scripts/mysql_install_db \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data \ --user=mysql
为文件添加可执行权限
chmod +x /etc/init.d/mysql
修改配置文件,
vi /etc/init.d/mysql 找到修改成 basedir=/usr/local/mysql datadir=/usr/local/mysql/data mysqld_pid_file_path=/usr/local/mysql/log/mysql.pid
为mysql服务添加开机自动启动
chkconfig --add mysql chkconfig --level 345 mysql on
具体的启动“等级”根据须要修改
前面都正确的话如今就能够启动服务了,
service mysql start
接下来是权限方面的配置
为可执行文件添加连接
ln -s /usr/local/mysql/bin/mysqladmin /usr/bin ln -s /usr/local/mysql/bin/mysql /usr/bin
这样就能够直接使用mysql和mysqladmin命令了,其余的根据须要再添加。
设置root用户(这个root是mysql的root用户)密码
mysqladmin -uroot password '你的密码'
接下来使用刚才的密码登陆mysql
mysql -uroot -p (接下来会要求输入你的密码)
登录成功后就能够配置具体的权限了,接下来的操做都是在“mysql>”提示符下进行的,表示已登陆mysql。
use mysql mysql> select user,password from user;
查询当前已有的帐户,能够看到有不少没有密码的用户,这是须要删除的,
delete from user where password=''; mysql> select user,password from user;
这样就会删除了空密码用户,而后在查看用户列表,就会发现只有一个用户了。
当前的用户还不能在除服务器外的机器上登陆,这显然是不该该的,添加root用户远程拥有全部权限
grant all privileges on *.* to root@'%' identified by '你的密码' with grant option;
具体的场景下,若是要对权限进行限制,则须要修改具体的语句。
为每个数据库建立单独的用户并分配全显示颇有必要的,下面就是建立一个名为recruitdba的用户,并分配权限为全部主机操做recruit数据库的全部权限
CREATE USER 'recruitdba'@'%' IDENTIFIED BY 'recruitdba'; grant all privileges on recruit.* to recruitdba@'%' identified by 'recruitdba' with grant option; flush privileges;
至此,mysql的安装和配制就完成了,具体的环境下有一些不同的就须要灵活变通了
有些时候会发现linux的防火墙会阻挡mysql的数据包,因此要添加防火墙规则
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT iptables -A OUTPUT -p tcp --sport 3306 -j ACCEPT service iptables save 进行保存 service iptables restart重启
这样设置以后按道理说就应该正确了,但事实上从其余主机访问仍是有问题,测试发现是防火墙的问题,
使用iptables -L -n查看到的这两条的顺序应该是这样
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:3306
可是结果倒是这样
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:3306
就是这两条的顺序有问题
Chain INPUT (policy ACCEPT) …… REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
先拒绝,再容许,就容许不了了,
使用
vi /etc/sysconfig/iptables
调整着两条记录的顺序,这样来的实在点,调整事后重启防火墙就好了