背景需求:
1)在一臺新採購的服務器上通過源碼編譯安裝一個版本爲5.5.x以上的MySQL數據庫,並將所有配置文件與數據等均存放在/opt/mysql,以便於今後實現快速遷移、複製和整體備份;
2)在同一個MySQL中運行兩個實例,一個綁定在端口3306,一個綁定在端口3307;綁定在3306端口的實例,不開啓binlog,數據存放在 /opt/mysql/data;綁定在3307端口的實例,開啓binlog,數據存放在/opt/mysql/data2;
3)兩個實例均採用InnoDB作爲默認的存儲引擎,字符編碼採用UTF-8;兩個實例均採用相同的性能優化配置參數,實現單機多實例的配置應用。
實施方案:
在編譯安裝時,將數據庫的配置文件my.cnf以及data目錄等均指向到/opt/mysql目錄;通過mysqld_multi的 方式來管理兩個不同的實例,採用相同的配置文件共享性能優化配置參數;在同一個配置文件中,利用[mysqld1]與[mysqld2]標籤實現不同實例 的差異化配置。
配置過程:
1、源碼編譯安裝MySQL
1)安裝所需系統軟件包
# yum -y install gcc gcc-c++ autoconf bison libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers
2)安裝前的系統設置
# mkdir /opt/mysql //mysql安裝目錄
# mkdir /opt/mysql/data //mysql數據存放目錄
# groupadd mysql //創建用戶
# useradd -g mysql mysql //創建用戶組
# chown mysql:mysql -R /opt/mysql/data //賦予數據存放目錄權限
3)安裝cmake
MySQL從5.5版本開始,通過./configure進行編譯配置方式已經被取消,取而代之的是cmake工具。因此,需要先在系統中源碼編譯安裝cmake。
# mkdir /home/tools
# cd /home/tools
# wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz
# tar xf cmake-2.8.4.tar.gz
# cd cmake-2.8.4
# ./configure
# make;make install
4)開始編譯安裝MySQL
# wget http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.19.tar.gz
# tar xf mysql-5.5.19.tar.gz
# cd mysql-5.5.19
# cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql \
-DSYSCONFDIR=/opt/mysql/etc \
-DMYSQL_DATADIR=/opt/mysql/data \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
-DMYSQL_USER=mysql \
-DEXTRA_CHARSETS=all \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1
# make;make install
2、創建單機支持多實例
1)進入MySQL主目錄
# cd /opt/mysql/
2)刪除默認的data目錄
# rm -rf data
3)創建需要的目錄
# mkdir etc tmp run log binlogs data data2
# chown -R mysql:mysql tmp run log binlogs data data2
4)創建my.cnf配置文件
# vi etc/my.cnf
## This server may run 2+ separate instances ## This is the general purpose database |
5)修改my.cnf讀寫權限,避免普通用戶獲取到MySQL密碼
# chown -R root:root /opt/mysql/etc
# chmod 600 /opt/mysql/etc/my.cnf
3、初始化數據庫
1)切換到mysql用戶,進入MySQL主目錄
# su - mysql
# cd /opt/mysql/
2)初始化實例[mysqld1]和[mysqld2]
# scripts/mysql_install_db --basedir=/opt/mysql --user=mysql --datadir=/opt/mysql/data/
# scripts/mysql_install_db --basedir=/opt/mysql --user=mysql --datadir=/opt/mysql/data2/
3)回到root,創建mysqld_multi.server腳本
# exit
# mkdir -p /opt/mysql/init.d
# cp support-files/mysqld_multi.server /opt/mysql/init.d/
# vi /opt/mysql/init.d/mysqld_multi.server
#!/bin/sh basedir=/opt/mysql conf=/opt/mysql/etc/my.cnf if test -x $bindir/mysqld_multi case "$1" in |
4、整體備份MySQL
# cd /opt/
# tar czvf mysql_5.5.19_full.tar.gz mysql5519/
備份完成後,直接將mysql_5.5.19_full.tar.gz拿到其他服務器上,解壓後便可以直接啓用。
5、管理MySQL實例
1)同時啓動實例 [mysqld1] 與 [mysqld2]:
# /opt/mysql/init.d/mysqld_multi.server start 1,2
2)查看兩個MySQL實例是否都已經成功啓動
# netstat -lntp | grep mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 28752/mysqld tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 28756/mysqld |
# /opt/mysql/init.d/mysqld_multi.server stop 1,2
僅啓動/關閉實例[mysqld1]:
# /opt/mysql/init.d/mysqld_multi.server start 1
# /opt/mysql/init.d/mysqld_multi.server stop 1
6、登陸MySQL實例
在啓動了實例[mysqld1]與[mysqld2]後,通過以下方式登陸不同的實例:
登陸[mysqld1]:
# /opt/mysql/bin/mysql -uroot -h127.0.0.1 -P3306 -p
登陸[mysqld2]:
# /opt/mysql/bin/mysql -uroot -h127.0.0.1 -P3307 -p
7、其他初始化設置
1)爲MySQL的root帳戶設置初始密碼
# /opt/mysql/bin/mysqladmin -u root -h127.0.0.1 -P3306 password '123456'
# /opt/mysql/bin/mysqladmin -u root -h127.0.0.1 -P3307 password '123456'
2)修改my.cnf配置文件中MySQL的root賬戶密碼
# vim /opt/mysql/etc/my.cnf
user = root ## Used for stopping the server via mysqladmin password = 123456 |
3)刪除匿名連接的空密碼帳號
分別登陸實例[mysqld1]與[mysqld2],執行以下命令:
mysql> use mysql; //選擇系統數據庫mysql Database changed mysql> select Host,User,Password from user; //查看所有用戶 +-----------+------+-------------------------------------------+ | Host | User | Password | +-----------+------+-------------------------------------------+ | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | mysql-01 | root | | | 127.0.0.1 | root | | | ::1 | root | | | localhost | | | | mysql-01 | | | +-----------+------+-------------------------------------------+ 6 rows in set (0.00 sec) mysql> delete from user where password=""; //刪除匿名連接的空密碼帳號 mysql> flush privileges; //刷新權限 mysql> select Host,User,Password from user; //確認密碼爲空的用戶是否已全部刪除 mysql> exit; |
1、採用源碼編譯安裝MySQL,可以方便我們自己組織所有MySQL相關文件的位置;同時經過源碼編譯安裝後的MySQL,可以直接複製到其它服務器上運行,大大方便了我們今後的遷移、備份和新服務器的配置;
2、本次方案僅僅實施了兩個實例[mysqld1]與[mysqld2],實際上我們可以通過這樣的方式,拓展實現[mysqld3],[mysqld4],[mysqld5]...等更多的實例;
3、MySQL自帶了幾個不同的配置文件,放置在/opt/mysql/support-files目錄下,分別是my-huge.cnf,my- innodb-heavy-4G.cnf,my-large.cnf,my-medium.cnf,my-small.cnf,通過名稱我們可以很直觀的 瞭解到他們是針對不同的服務器配置的;
4、在單機運行多實例的情況下,不要使用mysql -hlocalhost或直接忽略-h參數登陸服務器,因爲如果使用localhost或忽略-h參數,而不是指定127.0.0.1的話,即使選擇的端 口是3307,還是會登陸到3306實例中去,所以儘量避免這種混亂的產生,統一用127.0.0.1綁定端口或採用socket來登陸。