linux 上安裝多個不一樣版本的mysql 踩的坑

最近因爲業務須要,考慮使用json類型,據瞭解 mysql 在版本5.7中能夠支持 json 類型的數據支持,但同時目前開發環境中使用的是 mysql 5.6版本,上面還有不少項目的數據庫在上面,同時也沒有多餘的服務器可供使用,故不能直接卸載將 mysql直接升級版本。
從而想到在同一臺機器上安裝多個版本的 mysql 來解決問題。mysql

上面說到以前環境已經裝有mysql 5.6版本,基本配置以下:linux

datadir=/home/mysql/data
    basedir=/usr/local/mysql

同時配置文件 my.cnf放在在 /etc/目錄下。
此版本是經過 yum的方式來下載安裝的,故5.7的版本不能再使用這種方式安裝,以避免數據被覆蓋。sql

個人系統版本是centos 64位,故在官網下載 5.7 64版本的安裝包。(https://downloads.mysql.com/archives/get/file/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
具體操做以下:數據庫

mkdir /usr/local/app
cd /usr/local/app
wget -o https://downloads.mysql.com/archives/get/file/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
tar -xzf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql-5.7.24
mv mysql-5.7.24 ../
cd ../mysql-5.7.24

此時已將 mysql 5.7 解壓出來。這個版本的 mysql 已經不包含模板配置文件。此時初始化數據庫(先受權,因爲以前已經建立了mysql:mysql的用戶組及用戶了,但尚未5.7版本目錄和數據的權限):json

mkdir /home/mysql-5.7.24/data
chown mysql:mysql -R  /home/mysql-5.7.24/data /usr/local/mysql-5.7.24
./bin/mysqld --initialize --user=mysql --datadir=/home/mysql-5.7.24/data --basedir=/usr/local/mysql-5.7.24

此時會生成默認的 root 密碼,記下來。
而後再使用 mysqld_multi來管理多實例。本來我是想直接使用support-files目錄下mysql_server來啓動的,可是發現個問題,就是該腳本老是使用 /etc/my.cnf做爲配置文件來啓動的,因而我查了下資料,發現mysql讀寫配置順序以下:centos

/etc/my.cnf > /etc/mysql/my.cnf > /usr/etc/my.cnf > ~/.my.cnf

因爲該配置文件已被 5.6 版本的 mysql使用,故尋找其餘方法。服務器

方法一

使用 mysqld_multi來管理。
修改 /etc/my.cnf:app

#[client]
#port = 3306
#socket = /usr/local/mysql/mysql.sock

[mysqld_multi]
mysqld = /usr/local/mysql-5.7.24/bin/mysqld_safe
log = /var/log/mysqld_multi.log

[mysqld3306]
user=mysql
server_id=206
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid
slow-query-log-file = /home/mysql/logs/mysql-slow.log

[mysqld3307]
user=mysql
server_id=207
port = 3307
basedir = /usr/local/mysql-5.7.24
datadir = /home/mysql-5.7.24/data
tmpdir = /home/mysql-5.7.24/temp
socket = /usr/local/mysql-5.7.24/mysql.sock
log-error = /home/mysql-5.7.24/logs/mysql_error.log
pid-file = /home/mysql-5.7.24/mysql.pid
slow-query-log-file = /home/mysql-5.7.24/logs/mysql-slow.log

[mysqld]
#server_id=206
#binlog-do-db=testdb

binlog-ignore-db=mysql

log-bin=edu-mysql-slave1-bin

binlog_cache_size = 1M

binlog_format=mixed

expire_logs_days=7

slave_skip_errors=1062

relay_log=edu-mysql-relay-bin

log_slave_updates=1

read_only=0

character-set-server = utf8
collation-server = utf8_general_ci
skip-external-locking
skip-name-resolve
#user = mysql
#port = 3306
#basedir = /usr/local/mysql
#datadir = /home/mysql/data
#tmpdir = /home/mysql/temp
# server_id = .....
#socket = /usr/local/mysql/mysql.sock
#log-error = /home/mysql/logs/mysql_error.log
#pid-file = /home/mysql/mysql.pid
open_files_limit = 10240
back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800
#open_tables = 600
#table_cache = 650
#opened_tables = 630
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k
tmp_table_size = 256M
max_heap_table_size = 256M
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
lower_case_table_names=1
default-storage-engine = INNODB
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT
#####################
#thread_concurrency = 32
long_query_time= 2
slow-query-log = on
#slow-query-log-file = /home/mysql/logs/mysql-slow.log

[mysqld-5.7]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 1G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on

[mysqldump]
quick
max_allowed_packet = 32M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

上面多餘的配置根據需求能夠去掉,保留關鍵的配置便可,主要是端口,pid,和文件路徑這些要不同。
修改完成後,可使用 support_files目錄下的 mysqld_multi.server 來管理多個版本實例了。
./mysqld_multi.serverstart,stop,report幾個操做,顧名思義,使用就行了,report就是相似 status的意思。socket

./mysqld_multi.server report

發現
Reporting MySQL servers MySQL server from group: mysqld3306 is running MySQL server from group: mysqld3307 is not running
而後啓動3307便可,
./mysqld_multi.server start 3307
Reporting MySQL servers MySQL server from group: mysqld3306 is running MySQL server from group: mysqld3307 is running
不指定某個具體的實例就是啓動或者關閉全部的。優化

這樣就搞定了,但在終端使用客戶端的時候要注意要具體指定某一個sock文件和端口:

mysql -S /usr/local/mysql-5.7.24/mysql.sock -P 3307 -u root -p

最後,能夠將 mysqld_multi做爲系統服務:

cp /usr/local/mysql-5.7.24/support-files/mysqld_multi.server /etc/rc.d/init.d/mysqld_multi
chkconfig --add /mysqld_multi

就能夠直接使用了:

mysqld_multi report

方法二

使用 bin/mysqld_safe指定配置文件來啓動:

cp /etc/my.cnf ./
##改改其中的一些配置(端口,pid,和文件路徑)
./bin/mysqld_safe –defaults-file=/usr/local/mysql-5.7.24/my.cnf –basedir=/usr/local/mysql-5.7.24 –datadir=/home/mysql-5.7.24/data &

文章有些雜亂,有時間再優化。

相關文章
相關標籤/搜索