因爲工做和學習方面的緣由,常用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
調整着兩條記錄的順序,這樣來的實在點,調整事後重啓防火牆就好了