单机多实例可以有效的最大化服务器的利用率,mysql 多实例的实现方式也有两种:
独立配置文件:每个实例有自己单独的配置文件
mysqld_multi 单一配置文件统一管理:实例在单一配置文件中统一配置管理
这里我们使用 mysqld_multi 方式来创建多实例,管理起来比较方便
假设我们在 /usr/local/mysql 目录安装了 mysql
接下来我们创建 3307 和 3308 两个新实例
创建实例数据目录
-
[root@localhost ~]# mkdir /usr/local/mysql{3307,3308}/data -p
-
[root@localhost ~]# chown mysql.mysql /usr/local/mysql{3307,3308} -R
注意目录权限
初始化实例的数据库
mysql_install_db 方式已经 deprecated 了,我们使用 mysqld 的 initialize 方法来做初始化
-
# --no-defaults 不读取默认的 /etc/my.cnf 全局配置文件 否则可能存在一些冲突问题
-
# --initialize-insecure 初始化且不需要生成密码,我不太喜欢那一大串字符...
-
# --basedir mysql 的安装目录
-
# --datadir 本实例的数据目录
-
# --user 这样生成的文件用户为 mysql
-
# --explicit_defaults_for_timestamp timestamp 已经 deprecated 了
-
#生成 3307 的数据目录
-
[root@localhost ~]# mysqld --no-defaults \
-
--initialize-insecure \
-
--basedir=/usr/local/mysql \
-
--datadir=/usr/local/mysql3307/data \
-
--user=mysql \
-
--explicit_defaults_for_timestamp
-
#生成 3308 的数据目录
-
[root@localhost ~]# mysqld --no-defaults \
-
--initialize-insecure \
-
--basedir=/usr/local/mysql \
-
--datadir=/usr/local/mysql3308/data \
-
--user=mysql \
-
--explicit_defaults_for_timestamp
多实例配置文件
这里上传我的配置,你也可以使用
mysqld_multi --example > /etc/my_multi.cnf
来生成多实例配置示例。
我不想在管理多实例时再使用 --defaults-file 选项来指定单独的实例配置文件,所以就写到默认的 my.cnf 文件中了,你可以自行选择是否使用单独的配置文件
-
[client]
-
port = 3306
-
socket = /tmp/mysql.sock
-
[mysqld]
-
port = 3306
-
socket = /tmp/mysql.sock
-
datadir = /usr/local/mysql/data
-
skip-external-locking
-
key_buffer_size = 32M
-
max_allowed_packet = 1M
-
table_open_cache = 128
-
sort_buffer_size = 768K
-
net_buffer_length = 8K
-
read_buffer_size = 768K
-
read_rnd_buffer_size = 512K
-
myisam_sort_buffer_size = 8M
-
thread_cache_size = 16
-
query_cache_size = 16M
-
tmp_table_size = 32M
-
log-error = /usr/local/mysql/mysql_error.log
-
pid-file = /usr/local/mysql/mysql.pid
-
explicit_defaults_for_timestamp = true
-
#skip-networking
-
max_connections = 100
-
max_connect_errors = 5
-
open_files_limit = 65535
-
log-bin=mysql-bin
-
binlog_format=mixed
-
server-id = 1
-
expire_logs_days = 10
-
early-plugin-load = ""
-
default_storage_engine = InnoDB
-
innodb_data_home_dir = /usr/local/mysql/data
-
innodb_data_file_path = ibdata1:10M:autoextend
-
innodb_log_group_home_dir = /usr/local/mysql/data
-
innodb_buffer_pool_size = 128M
-
innodb_log_file_size = 32M
-
innodb_log_buffer_size = 8M
-
innodb_flush_log_at_trx_commit = 1
-
innodb_lock_wait_timeout = 50
-
[mysqldump]
-
quick
-
max_allowed_packet = 16M
-
[mysql]
-
no-auto-rehash
-
[myisamchk]
-
key_buffer_size = 32M
-
sort_buffer_size = 768K
-
read_buffer = 2M
-
write_buffer = 2M
-
[mysqlhotcopy]
-
interactive-timeout
-
# 多实例配置 可以把下面的内容拿出来单独放一个配置文件 启动时 --defaults-file 即可
-
[mysqld_multi]
-
mysqld = /usr/local/mysql/bin/mysqld_safe
-
mysqladmin = /usr/local/mysql/bin/mysqladmin
-
user = root
-
pass = 123456 #这里要注意5.7后用 pass 最方便, 5.6 用默认的 password 就好
-
# 实例3307
-
[mysqld3307]
-
port = 3307
-
socket = /tmp/mysql3307.sock
-
datadir = /usr/local/mysql3307/data
-
skip-external-locking
-
key_buffer_size = 32M
-
max_allowed_packet = 1M
-
table_open_cache = 128
-
sort_buffer_size = 768K
-
net_buffer_length = 8K
-
read_buffer_size = 768K
-
read_rnd_buffer_size = 512K
-
myisam_sort_buffer_size = 8M
-
thread_cache_size = 16
-
query_cache_size = 16M
-
tmp_table_size = 32M
-
log-error = /usr/local/mysql3307/mysql3307_error.log
-
pid-file = /usr/local/mysql3307/mysql3307.pid
-
explicit_defaults_for_timestamp = true
-
#skip-networking
-
max_connections = 100
-
max_connect_errors = 5
-
open_files_limit = 65535
-
log-bin=mysql-bin
-
binlog_format=mixed
-
server-id = 1
-
expire_logs_days = 10
-
early-plugin-load = ""
-
default_storage_engine = InnoDB
-
innodb_data_home_dir = /usr/local/mysql3307/data
-
innodb_data_file_path = ibdata1:10M:autoextend
-
innodb_log_group_home_dir = /usr/local/mysql3307/data
-
innodb_buffer_pool_size = 128M
-
innodb_log_file_size = 32M
-
innodb_log_buffer_size = 8M
-
innodb_flush_log_at_trx_commit = 1
-
innodb_lock_wait_timeout = 50
-
# 实例3308
-
[mysqld3308]
-
port = 3308
-
socket = /tmp/mysql3308.sock
-
datadir = /usr/local/mysql3308/data
-
skip-external-locking
-
key_buffer_size = 32M
-
max_allowed_packet = 1M
-
table_open_cache = 128
-
sort_buffer_size = 768K
-
net_buffer_length = 8K
-
read_buffer_size = 768K
-
read_rnd_buffer_size = 512K
-
myisam_sort_buffer_size = 8M
-
thread_cache_size = 16
-
query_cache_size = 16M
-
tmp_table_size = 32M
-
log-error = /usr/local/mysql3308/mysql3308_error.log
-
pid-file = /usr/local/mysql3308/mysql3308.pid
-
explicit_defaults_for_timestamp = true
-
#skip-networking
-
max_connections = 100
-
max_connect_errors = 5
-
open_files_limit = 65535
-
log-bin=mysql-bin
-
binlog_format=mixed
-
server-id = 1
-
expire_logs_days = 10
-
early-plugin-load = ""
-
default_storage_engine = InnoDB
-
innodb_data_home_dir = /usr/local/mysql3308/data
-
innodb_data_file_path = ibdata1:10M:autoextend
-
innodb_log_group_home_dir = /usr/local/mysql3308/data
-
innodb_buffer_pool_size = 128M
-
innodb_log_file_size = 32M
-
innodb_log_buffer_size = 8M
-
innodb_flush_log_at_trx_commit = 1
-
innodb_lock_wait_timeout = 50
这里其实有个小注意点:
在 [mysqld_multi ] 组里我并没有使用默认的 password 配置项, 而是用的 pass。
从5.6以后这货就被加密了必须用 -s 才能明文,mysqld_multi 读取的都是密文,无法 stop 实例。
运行多实例
-
# 可以看到多实例已经在运行了
-
# 多实例并不会影响默认实例的运行 我们仍可使用service mysql start|stop|restart|reload 管理默认实例
-
[root@localhost ~]# mysqld_multi start
-
[root@localhost ~]# mysqld_multi report
-
Reporting MySQL servers
-
MySQL server from group: mysqld3307 is running
-
MySQL server from group: mysqld3308 is running
设置实例密码
我们初始化实例的时候并没有设置root密码 默认为空 这是 --initialize-insecure 选项的作用
所以使用 mysqladmin 重置密码的时输入的原密码为空
-
[root@localhost local]# mysqladmin -u root -p password 123456 -S /tmp/mysql3307.sock
-
Enter password:
-
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
-
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
-
[root@localhost local]# mysqladmin -u root -p password 123456 -S /tmp/mysql3308.sock
-
Enter password:
-
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
-
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
我们可以为实例设置统一的密码,方便使用 mysqld_multi start|stop|reload 命令管理实例,否则你就得用 mysqladmin 这样玩了,自行选择
[root@localhost ~]# mysqladmin -uroot -pyourpassword -S /tmp/mysqlxxx.sock shutdown
配置完成
-
[root@localhost ~]# mysqld_multi start
-
[root@localhost ~]# mysqld_multi report
-
Reporting MySQL servers
-
MySQL server from group: mysqld3307 is running
-
MySQL server from group: mysqld3308 is running
-
[root@localhost ~]# mysqld_multi stop
-
[root@localhost ~]# mysqld_multi report
-
Reporting MySQL servers
-
MySQL server from group: mysqld3307 is not running
-
MySQL server from group: mysqld3308 is not running
-
[root@localhost ~]# mysqld_multi start 3308
-
[root@localhost ~]# mysqld_multi report
-
Reporting MySQL servers
-
MySQL server from group: mysqld3307 is not running
-
MySQL server from group: mysqld3308 is running
-
[root@localhost ~]# mysqld_multi stop 3308
-
[root@localhost ~]# mysqld_multi report
-
Reporting MySQL servers
-
MySQL server from group: mysqld3307 is not running