在linux上使用源代碼安裝MySQL

    因爲工做和學習方面的緣由,常用linux,前段時間折騰了幾回linux上源代碼方式安裝mysql,期間也參考了網友的各類介紹,如今總結以下,方便本身之後查看,也方便其餘人學習使用。mysql

1 環境

    linux:CentOS 6.5/6.3 x86/x86_64均實驗過linux

2 準備

    這裏進行介紹所須要的軟件或工具版本有: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

安裝完後就能夠進行正式的安裝了。緩存

3 安裝cmake

將下載好的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

4 準備mysql用戶和組以及目錄

groupadd mysql 
useradd -g mysql mysql 

cd /usr/local
mkdir mysql
cd mysql
mkdir data
mkdir log
cd ..
chown -R mysql:mysql mysql

這樣就建立了mysql的用戶和用戶組,也建立了安裝的相關目錄。這裏的目錄能夠修改,可是要和接下來的安裝配置相對應。

5 安裝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

6 mysql的安裝後配置

修改文件權限

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

接下來是權限方面的配置

7 mysql的權限和用戶配置

爲可執行文件添加連接

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的安裝和配製就完成了,具體的環境下有一些不同的就須要靈活變通了

8 額外配置

有些時候會發現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

調整着兩條記錄的順序,這樣來的實在點,調整事後重啓防火牆就好了

相關文章
相關標籤/搜索