目錄
准備工作
運行環境
確認你的安裝版本
下載mysql
安裝mysql
准備安裝環境
編譯和安裝
配置mysql
單實例配置
單實例配置方法
添加防火牆
啟動mysql
重啟mysql
多實例配置
什麼是多實例
多實例配置方法
創建啟動文件
初始化數據庫
配置防火牆
啟動mysql
登陸mysql
重啟mysql
本文的運行環境如下
系統版本
CentOS7最小化安裝:
Linux version 3.10.0-123.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Mon Jun 30 12:09:22 UTC 2014
mysql版本
mysql-5.6.25
mysql分為開發版本和穩定版本(GA),開發版本擁有最新的特性,但是並不穩定,也沒有完全經過測試,可能存在嚴重的bug,而穩定版本是經過了長時間的測試,消除了具有已知的bug,其穩定性和安全性都得到一定的保障。
對於一個mysql的版本號如:mysql-5.6.1-m1,這個版本號意味著什麼呢?
一旦選擇了版本號,就要選擇使用哪個發行版,你可以使用二進制發行版如RPM包或Zip壓縮包等,但是如果你要實現如下的功能,就要選擇源碼安裝(本文正是選擇源碼安裝的方式):
在這裡下載mysql:http://dev.mysql.com/downloads/mysql/
我選擇的是這個:
[root@localhost src]# md5sum mysql-5.6.25.tar.gz 37664399c91021abe070faa700ecd0ed mysql-5.6.25.tar.gz
可以看出,與上圖中的MD5是一致的,如果不一致,就要更換一個鏡像地址來下載mysql。
首先檢查是否已經安裝過mysql:
[root@localhost src]# rpm -qa | grep mysql
有的話就卸載掉以前安裝的mysql:
[root@localhost src]# rpm -e --nodeps xxx(xxx是搜索結果)
並刪除所有的相關文件:
/etc/my.cnf
安裝編譯代碼所需要的包
[root@localhost src]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio [root@localhost src]# yum install libaio libaio-devel -y [root@localhost src]# yum install perl-Data-Dumper -y [root@localhost src]# yum install net-tools -y
解壓安裝包並編譯安裝
[root@localhost src]# tar xvf mysql-5.6.25.tar.gz [root@localhost src]# cd mysql-5.6.25 [root@localhost mysql-5.6.25]#cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/etc \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ -DMYSQL_TCP_PORT=3306 \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci
[root@localhost src]# make && make install
至此,mysql安裝完成
檢查系統是否已經有mysql用戶,如果沒有則創建
[root@localhost mysql-5.6.25]# cat /etc/passwd | grep mysql [root@localhost mysql-5.6.25]# cat /etc/group | grep mysql
創建mysql用戶(但是不能使用mysql賬號登陸系統)
[root@localhost mysql-5.6.25]# groupadd mysql -s /sbin/nologin [root@localhost mysql-5.6.25]# useradd -g mysql mysql
修改權限
[root@localhost mysql-5.6.25]# chown -R mysql:mysql /usr/local/mysql
至此,mysql安裝完畢
下面有兩種配置方式,推薦按照多實例配置的方式
進入安裝路徑
[root@localhost mysql-5.6.25]# cd /usr/local/mysql
進入安裝路徑,執行初始化配置腳本,創建系統自帶的數據庫和表
[root@localhost mysql]# scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
注:在啟動MySQL服務時,會按照一定次序搜索my.cnf,先在/etc目錄下找,找不到則會搜索"$basedir/my.cnf",在本例中就是 /usr/local/mysql/my.cnf,這是新版MySQL的配置文件的默認位置!
注意:在CentOS 7版操作系統的最小安裝完成後,在/etc目錄下會存在一個my.cnf,需要將此文件更名為其他的名字,如:/etc/my.cnf.bak,否則,該文件會干擾源碼安裝的MySQL的正確配置,造成無法啟動。
在使用"yum update"更新系統後,需要檢查下/etc目錄下是否會多出一個my.cnf,如果多出,將它重命名成別的。否則,MySQL將使用這個配置文件啟動,可能造成無法正常啟動等問題。
[root@localhost mysql]# firewall-cmd --zone=public --add-port=3306/tcp --permanent [root@localhost mysql]# firewall-cmd --reload
添加服務,拷貝服務腳本到init.d目錄,並設置開機啟動
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysql [root@localhost mysql]# chkconfig mysql on [root@localhost mysql]# service mysql start --啟動MySQL
查看mysql是否啟動成功
[root@localhost mysql]# netstat -lntp | grep 3306
如果mysql沒有啟動成功,到目錄/usr/local/mysql/data下查看錯誤日志
[root@localhost data]# tail localhost.localdomain.err (localhost.localdomain是主機名)
如果沒有生成日志目錄,則mysql安裝沒有成功(再重新編譯安裝一次)
首先殺死mysql進程
[root@localhost 3306]# pkill mysqld
然後檢查是否已經殺死mysql進程
[root@localhost 3306]# netstat -lntp | grep 3306
此時shell沒有任何輸出,表明已經殺死了mysql進程
然後重啟mysql並再次檢查是否啟動成功
[root@localhost 3306]# service mysql start [root@localhost 3306]# netstat -lntp | grep 3306
簡單地說,就是在一台機器上開啟多個不同的服務端口,運行多個mysql服務進程,這些服務進程通過不同socket監聽不同服務端口來提供各自的服務。
這些mysql多實例公用一套mysql安裝程序,使用不同的my.cnf配置文件、啟動程序、數據文件,在提供服務時,多實例在邏輯上看起來是各自獨立的,多個實例之間根據配置文件的設定值,來取得相關服務器的硬件資源
在本文中,通過在mysql上開啟兩個端口(3306和3307來配置多實例,因為下面的主從同步要使用這兩個端口來模擬)
創建目錄(log目錄是存放mysql日志的地方)
[root@localhost mysql]# mkdir -p /data/{3306,3307}/data [root@localhost mysql]# mkdir -p /data/{3306,3307}/log
在/data/3306中新建my.cnf
[root@localhost mysql]# cd /data/3306 [root@localhost mysql]# vi my.cnf
把如下內容拷貝到該文件中
[client] port = 3306 socket = /data/3306/mysql.sock [mysqld] port=3306 socket = /data/3306/mysql.sock pid-file = /data/3306/data/mysql.pid basedir = /usr/local/mysql datadir = /data/3306/data server-id=1 #log-bin=mysql-bin #log-bin-index= mysql-bin.index # LOGGING log_error=/data/3306/log/mysql-error.log slow_query_log_file=/data/3306/log/mysql-slow.log slow_query_log=1
同樣地,在/data/3307中新建my.cnf
[root@localhost mysql]# cd /data/3307 [root@localhost mysql]# vi my.cnf
把如下內容拷貝到該文件中(把上面的3306改為3307,還有server-id的值)
[client] port = 3307 socket = /data/3307/mysql.sock [mysqld] port=3307 socket = /data/3307/mysql.sock pid-file = /data/3307/data/mysql.pid basedir = /usr/local/mysql datadir = /data/3307/data server-id=3 #log-bin=mysql-bin #log-bin-index= mysql-bin.index # LOGGING log_error=/data/3307/log/mysql-error.log slow_query_log_file=/data/3307/log/mysql-slow.log slow_query_log=1
檢查一下目錄結構,看看有沒有把文件放錯地方
[root@localhost 3307]# tree /data /data ├── 3306 │ ├── data │ ├── log │ └── my.cnf └── 3307 │ ├── data │ ├── log │ └── my.cnf
創建啟動文件
在/data/3306中新建mysql啟動文件
[root@localhost mysql]# cd /data/3306 [root@localhost mysql]# vi mysql
把如下內容拷貝到該文件中
#!/bin/sh port=3306 mysql_user="root" mysql_pwd="" CmdPath="/usr/local/mysql/bin" #startup function function_start_mysql() { printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & } #stop function function_stop_mysql() { printf "Stoping MySQL...\n" ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown } #restart function function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart}\n" esac
同理,在/data/3307中新建mysql啟動文件
[root@localhost mysql]# cd /data/3307 [root@localhost mysql]# vi mysql
把如下內容拷貝到該文件中
#!/bin/bash port=3307 mysql_user="root" mysql_pwd="" CmdPath="/usr/local/mysql/bin" #startup function function_start_mysql() { printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & } #stop function function_stop_mysql() { printf "Stoping MySQL...\n" ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown } #restart function function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql }
case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart}\n" esac
修改文件擁有者和權限
[root@localhost 3307]# chown -R mysql:mysql /data [root@localhost 3307]# find /data -name mysql -exec chmod 700 {} \;
添加mysql啟動路徑
[root@localhost 3307]# echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile [root@localhost 3307]# source /etc/profile [root@localhost 3307]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
可以看到mysql路徑已經添加到了啟動路徑中
[root@localhost scripts]# cd /usr/local/mysql/scripts [root@localhost scripts]# ./mysql_install_db --defaults-file=/data/3306/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data [root@localhost scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
[root@localhost scripts]# firewall-cmd --zone=public --add-port=3306/tcp --permanent success [root@localhost scripts]# firewall-cmd --zone=public --add-port=3307/tcp --permanent success [root@localhost scripts]# firewall-cmd --reload success
分別啟動兩個端口
[root@localhost scripts]# /data/3306/mysql start Starting MySQL... [root@localhost scripts]# /data/3307/mysql start Starting MySQL...
[root@localhost scripts]# netstat -lntp | grep 330 tcp6 0 0 :::3306 :::* LISTEN 33556/mysqld tcp6 0 0 :::3307 :::* LISTEN 34204/mysqld
可以看到兩個端口都已經啟動成功
剛安裝完的mysql是沒有登陸密碼的
[root@localhost scripts]# mysql -S /data/3306/mysql.sock
如果不成功,檢查/data/3306/log目錄下的mysql-error.log日志,逐一排除錯誤
如果登陸成功,下面就修改登錄密碼(不建議在shell環境下修改密碼,否則別人只要查看命令歷史就能看到密碼(前提是你沒有情況命令歷史))
mysql> update mysql.user set password=password("123456") where user='root'; mysql> flush privileges;
同理,使用上面的方法修改3307的登陸密碼
要把上面更改後的密碼寫回到mysql的啟動文件中(否則每次啟動、關閉、重啟mysql都要輸入密碼)
[root@localhost 3306]# sed -i 's/mysql_pwd=\"\"/mysql_pwd=\"123456\"/g' /data/3306/mysql [root@localhost 3306]# sed -i 's/mysql_pwd=\"\"/mysql_pwd=\"123456\"/g' /data/3307/mysql
注意把上面的123456改為設置的密碼
[root@localhost 3306]# /data/3306/mysql restart [root@localhost 3306]# netstat -lntp | grep 330 tcp6 0 0 :::3306 :::* LISTEN 35430/mysqld
可以看到3306端口重啟成功,同理可以重啟3307端口
至此,mysql-5.6.25在CentOS7上安裝完畢
tips:在我的github項目裡,有一個一鍵安裝mysql的腳本:https://github.com/Kylinlin/install_mysql_automatically 不過該腳本還不是很完善,同樣地,有任何問題請發郵件到我的郵箱裡。