最近朋友在搞在Linux上配置MySql5.7多實例教程,在網上查詢了很多資料,一直報各種各樣的錯誤,后來在網上搜了一篇博客,根據其配置,最近是配置成功了
參考配置連接:https://blog.csdn.net/zougen/article/details/79567744
在開始正式配置之前,應該先問自己幾個問題:
- 什么是數據庫多實例
簡單的說,MySql多實例就是在一台服務器上同時開啟多個不同的服務端口(如:3306、3307等),同時運行多個MySql服務進程,這些服務進程通過不同的Socket監聽不同的服務端口來提供服務。
- 多實例的好處
- 可有效利用服務器資源。當單個服務器資源有剩余時,可以充分利用剩余資源提供更多的服務,且可以實現資源的邏輯隔離
- 節約服務器資源。例如公司服務器資源緊張,但是數據庫又需要各自盡量獨立的提供服務,並且還需要到主從復制等技術,多實例就是您的最佳選擇
- 多實例弊端
存在資源互相搶占的問題。比如:當某個數據庫實例並發很高或者SQL查詢慢時,整個實例會消耗大量的CPU、磁盤I/O等資源,導致服務器上面其他的數據庫實例在提供服務的質量也會下降
所以具體的需求要根據自己的實際情況而定。
下面我們來具體說一下MySql5.7的多實例配置:
1,幾個實例要分開運行,則必須放在不同的文件夾下才可以,為了方便文章后期的操作,我們則根據端口來命名文件夾(3306/3307/3308),新建文件夾有兩種形式
- 通過命令“mkdir /usr/mysql/3306”手動創建文件夾
- 通過配置文件自動生成配置下的文件夾
2,通過命令(vim/vi)來創建初始化數據配置文件(3306.cnf)的配置文件並根據自己的數據庫安裝,更改文件中的信息(最終初始化后即可刪除),配置文件內容如下:
[client] port = 3306 socket = /tmp/mysql3308.sock [mysqld] port = 3306 socket = /tmp/mysql3306.sock basedir = /usr/local/mysql/mysqlinstall datadir = /usr/mysql/3306 skip-external-locking key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 1024 sort_buffer_size = 4M net_buffer_length = 8K read_buffer_size = 4M read_rnd_buffer_size = 512K myisam_sort_buffer_size = 64M thread_cache_size = 128 query_cache_size = 128M tmp_table_size = 128M explicit_defaults_for_timestamp = true max_connections = 500 max_connect_errors = 100 open_files_limit = 65535 log-bin=/usr/mysql/3306/mysql-bin binlog_format=mixed server-id = 3306 expire_logs_days = 10 early-plugin-load = "" default_storage_engine = InnoDB innodb_data_home_dir = /usr/mysql/3306 innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /usr/mysql/3306 innodb_buffer_pool_size = 1024M innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 transaction-isolation=READ-COMMITTED [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 256M sort_buffer_size = 4M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
3,文件創建完成后,執行下面的命令進行初始化
mysqld --defaults-file=/usr/mysql/3306.cnf --initialize-insecure --user=mysql
注意:此處的初始化方式和安裝數據庫時初始化方式不同,以下時安裝數據庫時初始化的方式
- 安裝數據庫時的初始化方式為:
mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/mysql/3306 --user=mysql
- 在官方教程中新的初始化方式為:
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql/mysql --datadir=/opt/mysql/mysql/data
4,初始化完成后,3306.cnf文件就已經完成來,在接下來的配置中會在my.cnf中統一配置,也就是說,在后續的操作中不會在用到3306.cnf這個文件來,可以將其刪除,這個時候再去查詢則在配置文件中配置的路徑下,則會存在3306這個文件夾,根據此步驟,將3307和3308目錄進行初始化完成
注意:目錄在初始化之前,必須將文件夾清空,里面不能有任何文件,否則會報錯
5,經過上面的【1~4】步驟,分別將數據目錄文件初始化完成,這個時候需要將這三個文件目錄的權限更改成和數據庫安裝目錄一直的,否則會報權限的錯誤
chown -R mysql.mysql /usr/mysql/3306
6,備份原來的my.cnf文件
cp /etc/my.cnf /etc/my.cnf.bak
7,編輯my.cnf文件
vim /etc/my.cnf
清空原先的內容,然后將里面的內容更改成下面的配置文件,配置完成后通過“:wq”進行保存
[mysqld_multi] mysqld = /usr/local/mysql/mysqlinstall/bin/mysqld_safe mysqladmin = /usr/local/mysql/mysqlinstall/bin/mysqladmin [mysqld1] port = 3306 socket = /tmp/mysql3306.sock datadir = /usr/mysql/3306 skip-external-locking key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 1024 sort_buffer_size = 4M net_buffer_length = 8K read_buffer_size = 4M read_rnd_buffer_size = 512K myisam_sort_buffer_size = 64M thread_cache_size = 128 query_cache_size = 128M tmp_table_size = 128M explicit_defaults_for_timestamp = true max_connections = 500 max_connect_errors = 100 open_files_limit = 65535 log-bin=/usr/mysql/3306/mysql-bin binlog_format=mixed server-id = 3306 expire_logs_days = 10 early-plugin-load = "" default_storage_engine = InnoDB innodb_data_home_dir = /usr/mysql/3306 innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /usr/mysql/3306 innodb_buffer_pool_size = 1024M innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 transaction-isolation=READ-COMMITTED user = mysql [mysqld2] port = 3307 socket = /tmp/mysql3307.sock datadir = /usr/mysql/3307 skip-external-locking key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 1024 sort_buffer_size = 4M net_buffer_length = 8K read_buffer_size = 4M read_rnd_buffer_size = 512K myisam_sort_buffer_size = 64M thread_cache_size = 128 query_cache_size = 128M tmp_table_size = 128M explicit_defaults_for_timestamp = true max_connections = 500 max_connect_errors = 100 open_files_limit = 65535 log-bin=/usr/mysql/3307/mysql-bin binlog_format=mixed server-id = 3307 expire_logs_days = 10 early-plugin-load = "" default_storage_engine = InnoDB innodb_data_home_dir = /usr/mysql/3307 innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /usr/mysql/3307 innodb_buffer_pool_size = 1024M innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 transaction-isolation=READ-COMMITTED user = mysql [mysqld3] port = 3308 socket = /tmp/mysql3308.sock datadir = /usr/mysql/3308 skip-external-locking key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 1024 sort_buffer_size = 4M net_buffer_length = 8K read_buffer_size = 4M read_rnd_buffer_size = 512K myisam_sort_buffer_size = 64M thread_cache_size = 128 query_cache_size = 128M tmp_table_size = 128M explicit_defaults_for_timestamp = true max_connections = 500 max_connect_errors = 100 open_files_limit = 65535 log-bin=/usr/mysql/3308/mysql-bin binlog_format=mixed server-id = 3308 expire_logs_days = 10 early-plugin-load = "" default_storage_engine = InnoDB innodb_data_home_dir = /usr/mysql/3308 innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /usr/mysql/3308 innodb_buffer_pool_size = 1024M innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 transaction-isolation=READ-COMMITTED user = mysql [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 256M sort_buffer_size = 4M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
注意:mysqld_multi的配置文件和一般MySQL配置不同,沒有[mysqld]
段,取而代之的是[mysqld1]
、[mysqld2]
等配置段,每個配置段分別代表一個MySQL實例
8,啟動多個MySql實例:
- 做好以上兩個步驟之后,就可以啟動MySQL了。
- 啟動時需要一個啟動腳本,這個腳本一般在“
/usr/local/mysql/support-files”
目錄下“mysqld_multi.server“
,將這個腳本復制到“init.d”目錄下
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/rc.d/init.d/mysqld_multi
之后就可以用命令:
/etc/rc.d/init.d/mysqld_multi start 1-3
關閉多個進程的命令:
/etc/rc.d/init.d/mysqld_multi stop 1-3
注意:啟動三個MySQL實例,注意這里的數字和my.cnf
中的[mysqldN]
對應,1-3就是啟動[mysqld1]
、[mysqld2]
、[mysqld3]
配置段的MySQL實例
9,運行命令,查看端口,看MySQL有沒有正常啟動,如果沒有啟動或報錯,一般報錯詳細日志存在各個實例data目錄下的 主機名.err
文件中,打開此文件查找錯誤原因,逐步排錯就可以了。
netstat -ano | egrep "3306|3307|3308"
10,因為在初始化數據目錄的時候,用的是--initialize-insecure
參數,所以我們初始化的數據庫,root賬戶是沒有密碼的!要先改密碼:
mysqladmin -uroot password '123' -S /tmp/mysql3306.sock mysqladmin -uroot password '123' -S /tmp/mysql3307.sock mysqladmin -uroot password '123' -S /tmp/mysql3308.sock
或者通過下面命令初始化密碼:
mysqladmin -uroot password '123' -P3306 -h127.0.0.1 mysqladmin -uroot password '123' -P3307 -h127.0.0.1 mysqladmin -uroot password '123' -P3308 -h127.0.0.1
11,如果需要開啟root遠程登陸權限
mysql -uroot -p'123' -P3306 -h127.0.0.1 use mysql update user set host='%' where user='root'; flush privileges; select user,host,authentication_string from user;
小結:
配置到這的時候說明MySql數據庫的多實例已經配置完成,具體在實際中的應用還需根據您的需求