mysql multi主从复制_mysqld_multi方式配置Mysql数据库主从复制
mysqld_multi設(shè)計(jì)用于管理在同一臺(tái)機(jī)器上運(yùn)行的多個(gè)mysqld進(jìn)程,這些進(jìn)程使用不同的socket文件并監(jiān)聽在不同的端口上。mysqld_multi可以批量啟動(dòng)、關(guān)閉、或者報(bào)告這些mysqld進(jìn)程的狀態(tài)。在這里我們通過這種方式來在同一個(gè)機(jī)器上啟動(dòng)多個(gè)數(shù)據(jù)庫(kù)實(shí)例,并配置主從關(guān)系。
1、下載MySQL壓縮包
wget http://dev.MySQL.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
2、創(chuàng)建安裝目錄
這里我將Mysql安裝在/usr/local/mysql目錄里面,也可以安裝在其他地方;
mkdir /usr/local/mysql
3、解壓并復(fù)制
tar -xvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.7.18-linux-glibc2.5-x86_64/* /usr/local/mysql/
4、創(chuàng)建data目錄
mkdir /usr/local/mysql/data{3306,3307,3308} -p
5、創(chuàng)建mysql用戶組及其用戶
groupadd mysql
useradd -r -g mysql mysql
6、修改權(quán)限
chown -R mysql:mysql /usr/local/mysql
7、初始化實(shí)例的數(shù)據(jù)庫(kù)
mysql_install_db 方式已經(jīng) deprecated 了,我們使用 mysqld 的 initialize 方法來做初始化
# --no-defaults 不讀取默認(rèn)的 /etc/my.cnf 全局配置文件 否則可能存在一些沖突問題
# --initialize-insecure 初始化且不需要生成密碼,我不太喜歡那一大串字符...
# --basedir mysql 的安裝目錄
# --datadir 本實(shí)例的數(shù)據(jù)目錄
# --user 這樣生成的文件用戶為 mysql
# --explicit_defaults_for_timestamp timestamp 已經(jīng) deprecated 了
#生成 3306 的數(shù)據(jù)目錄
[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3306 --user=mysql --explicit_defaults_for_timestamp
#生成 3307 的數(shù)據(jù)目錄
[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3307 --user=mysql --explicit_defaults_for_timestamp
#生成 3307 的數(shù)據(jù)目錄
[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3308 --user=mysql --explicit_defaults_for_timestamp
8、將mysql命令加入環(huán)境變量
在/etc/profile最后加入兩行命令:
MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
最后執(zhí)行source /etc/profile,使得配置生效
9、創(chuàng)建/etc/my.cnf
[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe #mysqld命令的位置,用于啟動(dòng)mysql實(shí)例,也可以指定為mysqld_safe命令的位置
mysqladmin = /usr/local/mysql/bin/mysqladmin #用于停止mysql實(shí)例
user=root #調(diào)用mysqladmin時(shí)使用的賬號(hào)
#password=123456 調(diào)用 mysqladmin時(shí)使用的賬號(hào)的密碼,因?yàn)槲覀兪褂昧薸nitialize-insecure,所以root用戶最開始是沒有密碼的
log=/usr/local/mysql/mysql_multi.log
[mysqld3306]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data3306
port=3306
user=mysql
socket=/tmp/mysql.sock3306
server_id=1
log_bin=mysql-bin #主庫(kù)
[mysqld3307]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data3307
port=3307
user=mysql
socket=/tmp/mysql.sock3307
server_id=2
[mysqld3308]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data3308
port=3308
user=mysql
socket=/tmp/mysql.sock3308
server_id=3
在mysqld_multi中配置的user和password是mysql的用戶名和密碼。為了使用mysqld_multi命令,每個(gè)mysql實(shí)例都必須要提供一個(gè)相同的用戶名和密碼,用于啟動(dòng)和停止服務(wù)。而且要確保這個(gè)用戶具有停止mysql實(shí)例的權(quán)限。提示:
在[mysqlN]中配置的user是linux中的用戶,是啟動(dòng)mysql服務(wù)實(shí)例時(shí)使用的用戶
mysqld_multi提供了start, stop, reload (stop and restart)和report 表示要執(zhí)行的不同操作。可以參見官方文檔查看https://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html其完整用法,因?yàn)槊罘浅:?jiǎn)單,這里不做過多介紹。
10、啟動(dòng)MySQL實(shí)例
[root@localhost mysql]# mysqld_multi start
11、查看3個(gè)實(shí)例的運(yùn)行狀態(tài)
[root@localhost mysql]# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld3306 is running
MySQL server from group: mysqld3307 is running
MySQL server from group: mysqld3308 is running
也可以通過netstat-tln來查看
[root@localhost Desktop]# netstat -tln|grep 330*
tcp 0 0 :::3307 :::* LISTEN
tcp 0 0 :::3308 :::* LISTEN
tcp 0 0 :::3306 :::* LISTEN
12 配置主從關(guān)系
打開3個(gè)命令行窗口,分別執(zhí)行以下命令登錄主從數(shù)據(jù)庫(kù):
mysql -h127.0.0.1 -uroot -P3306 -p
mysql -h127.0.0.1 -uroot -P3307 -p
mysql -h127.0.0.1 -uroot -P3308 -p
因?yàn)槲覀兂跏蓟瘮?shù)據(jù)庫(kù)的時(shí)候,沒有為root用生成密碼,因此出現(xiàn)提示輸入password的時(shí)候,直接按enter鍵就可以了。在這3個(gè)命令行窗口都執(zhí)行以下命令,用于創(chuàng)建復(fù)制賬號(hào):
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'localhost' IDENTIFIED BY 'slave';
理論上,只要再主庫(kù)上創(chuàng)建復(fù)制賬號(hào)即可,但是因?yàn)榭紤]到主備切換的問題,因此在從庫(kù)上也創(chuàng)建復(fù)制賬號(hào)。另外需要注意的是,從庫(kù)從主庫(kù)復(fù)制,本身只需要REPLICATION SLAVE權(quán)限即可,REPLICATION CLIENT權(quán)限是讓這個(gè)用戶擁有執(zhí)行SHOW MASTER STATUS和SHOW SLAVE STATUS命令,也就是說這個(gè)權(quán)限是用于授予賬戶監(jiān)視Replication狀況的權(quán)力,我們將在之后看到這兩個(gè)命令如何使用。
我們需要在3307和3308上,分別執(zhí)行以下命令,將3306設(shè)置為主庫(kù),這一步是告訴備庫(kù)如何連接到主庫(kù)并重復(fù)其二進(jìn)制日志,舊版本的方式是通過修改my.cnf來配置,但是在新的版本中,修改my.cnf的配置方式已經(jīng)廢棄。而是使用CHANGE MASTER TO 語(yǔ)句,該語(yǔ)句完全替代了my.cnf 中相應(yīng)的設(shè)置,并且允許以后指向別的主庫(kù)時(shí)無(wú)須重啟備庫(kù)。下面是復(fù)制開始的基本命令:
mysql> CHANGE MASTER TO
MASTER_HOST='localhost',
MASTER_USER='slave',
MASTER_PORT=3306,
MASTER_PASSWORD='slave',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
只需要配置一次即可,之后重啟的時(shí)候,slave會(huì)自動(dòng)連接到master同步數(shù)據(jù),不需要每次都執(zhí)行這些命令。
需要注意的是,此時(shí)復(fù)制并沒有真正的開始,我們可以在主庫(kù)3306上執(zhí)行以下命令,,查看主庫(kù)狀態(tài):
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> show processlist;
+----+------+-----------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+------+---------+------+----------+------------------+
| 3 | root | localhost:58685 | NULL | Query | 0 | starting | show processlist |
+----+------+-----------------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)
在從庫(kù)3307或者3308上,執(zhí)行以下命令:
mysql> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: localhost
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
...omitted....
Seconds_Behind_Master: NULL
...omitted....
1 row in set (0.00 sec)
Slave_IO_State、Slave_IO_Running、Slave_SQL_Running這三列顯示備庫(kù)復(fù)制尚未執(zhí)行。
此時(shí)在從庫(kù)3307和3308上分別執(zhí)行以下命令,開始復(fù)制:
mysql> start slave;
此時(shí)在3307和3308上再執(zhí)行show slave status,可以看到
mysql> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event #等待主庫(kù)發(fā)送bin-log同步事件
Master_Host: localhost
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes #狀態(tài)變?yōu)閅ES
Slave_SQL_Running: Yes #狀態(tài)變?yōu)閅ES
Replicate_Do_DB:
Replicate_Ignore_DB:
...omitted....
Seconds_Behind_Master: NULL
...omitted....
此時(shí)再查看主庫(kù)3306的狀態(tài)
mysql> show processlistG;
*************************** 1. row ***************************
Id: 3
User: root
Host: localhost:58685
db: NULL
Command: Query
Time: 0
State: starting
Info: show processlist
*************************** 2. row ***************************
Id: 4
User: slave
Host: localhost:35312
db: NULL
Command: Binlog Dump
Time: 161
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
*************************** 3. row ***************************
Id: 5
User: slave
Host: localhost:35313
db: NULL
Command: Binlog Dump
Time: 154
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
3 rows in set (0.00 sec)
可以看有2個(gè)線程執(zhí)行了Binlog Dump命令,這就是我們的兩個(gè)從庫(kù)已經(jīng)開始復(fù)制。
現(xiàn)在在主庫(kù)3306上創(chuàng)建一個(gè)庫(kù)draon_ha,在其中創(chuàng)建一個(gè)表user,并插入一條記錄,這數(shù)據(jù)都會(huì)自動(dòng)同步到兩個(gè)從庫(kù)中
CREATE DATABASE `dragon_ha`;
use dragon_ha;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user(name) values('tianshouzhi');
mysql> show databases;分別在3307和3308兩個(gè)從庫(kù)中執(zhí)行以下命令,查看數(shù)據(jù)是否已經(jīng)同步:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dragon_ha |#插入的庫(kù)已經(jīng)同步
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use dragon_ha;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------+
| Tables_in_dragon_ha |
+---------------------+
| user |#插入的表已經(jīng)同步
+---------------------+
1 row in set (0.00 sec)
mysql> select * from user;
+----+-------------+
| id | name |
+----+-------------+
| 1 | tianshouzhi |#插入的記錄已經(jīng)同步
+----+-------------+
1 row in set (0.00 sec)
總結(jié)
以上是生活随笔為你收集整理的mysql multi主从复制_mysqld_multi方式配置Mysql数据库主从复制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手持巡检仪_专业的三防产品设计-电力巡检
- 下一篇: mysql输出美式报表_Navicat