debian9 使用mysqld_multi 來配置安裝單機多實例以及主從
默認已經apt install 好了mysql-server, 目的只是測試下mysqld_multi 來配置單機多實例和主從. 這裏沒有用docker來直接啓不同的mysql實例.
默認的mysql已經啓用並且佔用3306端口, 新加的3307和3308 分別爲 從(3307)和主(3308).
mysql 3306 獨立運行, 使用配置/etc/mysql/my.cnf (軟鏈到 /etc/mysql/mysql.cnf)
mysql的主從基於binlong, 所以主需要開啓binlong, 主上有一個log dump的縣城, 用來和從的I/O線程傳遞binlog, 從將主的binlog事件(sql語句)同步到從機並記錄在relaylog 裏, 從根據relaylog的sql語句按序執行.
單機多實例配置
新加兩個實例, 分別是3307和3308端口.
首先是增加配置, 在/etc/mysql/ 下新建一個文件 mysql_multi.cnf
[client]
default-character-set=utf8
default-character-set=utf8mb4
[mysql]
prompt=\\u@\\h:\\p \\d \\r:\\m:\\s>
default-character-set = utf8
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root
password = 123456
log = /var/log/mysql/mysqld_multi.log
[mysqld3308]
default-storage-engine=INNODB
init-connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci
user = mysql
port = 3308
basedir = /usr
datadir = /var/lib/mysql3308
tmpdir = /tmp
socket = /var/run/mysqld/mysqld3308.sock
pid-file = /var/run/mysqld/mysqld3308.pid
log-error = /var/log/mysql/mysql3308.log
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 0.0.0.0
net_buffer_length = 640K
net_read_timeout = 60
net_write_timeout = 60
connect_timeout = 10
tmp_table_size = 256M
skip-name-resolve
max_allowed_packet = 16M
table_open_cache = 512
read_buffer_size = 2M
read_rnd_buffer_size = 8M
thread_stack = 192K
thread_cache_size = 8
slow-query-log = 1
long_query_time = 10
log_queries_not_using_indexes = 1
expire_logs_days = 30
[mysqld3307]
port = 3307
basedir = /usr
datadir = /var/lib/mysql3307
tmpdir = /tmp
socket = /var/run/mysqld/mysqld3307.sock
pid-file = /var/run/mysqld/mysqld3307.pid
log-error = /var/log/mysql/mysql3307.log
user = mysql
接下來創建兩個實例的目錄
#mkdir /var/lib/mysql3307 /var/lib/mysql3308
#chown -R mysql:mysql /var/lib/mysql3307 /var/lib/mysql3308
初始化實例
#mysqld --initialize --basedir=/usr --datadir=/var/lib/mysql3307 --user=mysql
這裏會有個密碼1, 簡單記下
#mysqld --initialize --basedir=/usr --datadir=/var/lib/mysql3308 --user=mysql
這裏會有個密碼2, 簡單記下
不想記住密碼的話, 用參數–initialize-insecure
爲了簡單我這裏都用的root/123456 作爲mysql帳號密碼
mysqld_multi start/stop/report/reload [server-id]
命令一看就明白. 開始/停止/報告/重啓含加載
啓動
mysqld_multi --defaults-extra-file=/etc/mysql/mysql_multi.cnf start
接下來進去修改下密碼
/usr/bin/mysqladmin -u root -p password "123456" -S /var/run/mysqld/mysqld3307.sock
輸入剛纔記的密碼1
然後嘗試登錄
mysql -uroot -p -P3307 -S /var/run/mysqld/mysqld3307.sock
注意, 這裏指定了SOCK參數, 如果想不指定sock參數, 可以用-hserver_ip 來鏈接(不能用localhost或者域名, 還沒授權)
mysql -uroot -p -h127.0.0.1 -P3307
查看下權限, 沒有就授權, 簡單就授權了所有
>show grants for 'root';
>grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
>flush privileges;
3308 重複上面操作
這時單機就啓了3個實例了. 包含一個原本的3306, 通過mysqld_multi 啓的3307和3308, 各實例間沒有關係.
現在配置3307爲從, 3308爲主.
進入3308 創建ssss的DB和aaatest的表
create database ssss;
use ssss;
CREATE TABLE `aaatest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` varchar(10) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `aaatest` (`content`) VALUES ('aaa'),('bbb'),('ccc'),('ddd');
然後把這個庫和表導入到3307
在[mysqld3308] 裏面增加
server-id=3308
log-bin=/var/lib/mysql3308/mysql-bin-3308
binlog_do_db = ssss #要同步的庫, 這裏我創建了一個ssss的DB, 裏面有一個表aaatest
binlog-ignore-db = mysql #不同步mysql庫和test庫
binlog-ignore-db = test
log-slave-updates
sync_binlog=1
auto_increment_offset = 1
auto_increment_increment = 1
expire_logs_days = 7
log_bin_trust_function_creators = 1
在[mysqld3307] 裏面增加
server-id=3307
#replicate-do-db=ssss
replicate-wild-do-table = ssss.%
replicate-wild-ignore-table = test.%
接下來重啓下3307和3308
mysqld_multi --defaults-extra-file=/etc/mysql/mysql_multi.cnf reload
然後登錄3308, 執行
show master status;
記下File
接下來去3307來啓動slave和配置master (mysql5.5 後執行在mysql 裏面執行命令來配置啓用master slave同步)
mysql 3307>CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_USER='root',
MASTER_PORT=3308,
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin-3308.000004',
MASTER_LOG_POS=0;
mysql 3307>slave start;
mysql 3307>show slave status\G;
可以看見在主庫3308上已經多了一個Binlog Dump的線程
分別查詢下數據.
在3308主上插入一條, 從庫執行查詢
這樣單機多實例主從就實現了. 裏面有權限的一些配置, 這個按需配置就行了. 還有一些主從參數的優化查下官方手冊就可以了.