mysql multi主从复制_mysqld_multi方式配置Mysql数据库主从复制
mysqld_multi設計用于管理在同一臺機器上運行的多個mysqld進程,這些進程使用不同的socket文件并監聽在不同的端口上。mysqld_multi可以批量啟動、關閉、或者報告這些mysqld進程的狀態。在這里我們通過這種方式來在同一個機器上啟動多個數據庫實例,并配置主從關系。
1、下載MySQL壓縮包
wget http://dev.MySQL.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
2、創建安裝目錄
這里我將Mysql安裝在/usr/local/mysql目錄里面,也可以安裝在其他地方;
mkdir /usr/local/mysql
3、解壓并復制
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、創建data目錄
mkdir /usr/local/mysql/data{3306,3307,3308} -p
5、創建mysql用戶組及其用戶
groupadd mysql
useradd -r -g mysql mysql
6、修改權限
chown -R mysql:mysql /usr/local/mysql
7、初始化實例的數據庫
mysql_install_db 方式已經 deprecated 了,我們使用 mysqld 的 initialize 方法來做初始化
# --no-defaults 不讀取默認的 /etc/my.cnf 全局配置文件 否則可能存在一些沖突問題
# --initialize-insecure 初始化且不需要生成密碼,我不太喜歡那一大串字符...
# --basedir mysql 的安裝目錄
# --datadir 本實例的數據目錄
# --user 這樣生成的文件用戶為 mysql
# --explicit_defaults_for_timestamp timestamp 已經 deprecated 了
#生成 3306 的數據目錄
[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3306 --user=mysql --explicit_defaults_for_timestamp
#生成 3307 的數據目錄
[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3307 --user=mysql --explicit_defaults_for_timestamp
#生成 3307 的數據目錄
[root@localhost ~]# mysqld --no-defaults --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data3308 --user=mysql --explicit_defaults_for_timestamp
8、將mysql命令加入環境變量
在/etc/profile最后加入兩行命令:
MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
最后執行source /etc/profile,使得配置生效
9、創建/etc/my.cnf
[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe #mysqld命令的位置,用于啟動mysql實例,也可以指定為mysqld_safe命令的位置
mysqladmin = /usr/local/mysql/bin/mysqladmin #用于停止mysql實例
user=root #調用mysqladmin時使用的賬號
#password=123456 調用 mysqladmin時使用的賬號的密碼,因為我們使用了initialize-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 #主庫
[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命令,每個mysql實例都必須要提供一個相同的用戶名和密碼,用于啟動和停止服務。而且要確保這個用戶具有停止mysql實例的權限。提示:
在[mysqlN]中配置的user是linux中的用戶,是啟動mysql服務實例時使用的用戶
mysqld_multi提供了start, stop, reload (stop and restart)和report 表示要執行的不同操作。可以參見官方文檔查看https://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html其完整用法,因為命令非常簡單,這里不做過多介紹。
10、啟動MySQL實例
[root@localhost mysql]# mysqld_multi start
11、查看3個實例的運行狀態
[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 配置主從關系
打開3個命令行窗口,分別執行以下命令登錄主從數據庫:
mysql -h127.0.0.1 -uroot -P3306 -p
mysql -h127.0.0.1 -uroot -P3307 -p
mysql -h127.0.0.1 -uroot -P3308 -p
因為我們初始化數據庫的時候,沒有為root用生成密碼,因此出現提示輸入password的時候,直接按enter鍵就可以了。在這3個命令行窗口都執行以下命令,用于創建復制賬號:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'localhost' IDENTIFIED BY 'slave';
理論上,只要再主庫上創建復制賬號即可,但是因為考慮到主備切換的問題,因此在從庫上也創建復制賬號。另外需要注意的是,從庫從主庫復制,本身只需要REPLICATION SLAVE權限即可,REPLICATION CLIENT權限是讓這個用戶擁有執行SHOW MASTER STATUS和SHOW SLAVE STATUS命令,也就是說這個權限是用于授予賬戶監視Replication狀況的權力,我們將在之后看到這兩個命令如何使用。
我們需要在3307和3308上,分別執行以下命令,將3306設置為主庫,這一步是告訴備庫如何連接到主庫并重復其二進制日志,舊版本的方式是通過修改my.cnf來配置,但是在新的版本中,修改my.cnf的配置方式已經廢棄。而是使用CHANGE MASTER TO 語句,該語句完全替代了my.cnf 中相應的設置,并且允許以后指向別的主庫時無須重啟備庫。下面是復制開始的基本命令:
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;
只需要配置一次即可,之后重啟的時候,slave會自動連接到master同步數據,不需要每次都執行這些命令。
需要注意的是,此時復制并沒有真正的開始,我們可以在主庫3306上執行以下命令,,查看主庫狀態:
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)
在從庫3307或者3308上,執行以下命令:
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這三列顯示備庫復制尚未執行。
此時在從庫3307和3308上分別執行以下命令,開始復制:
mysql> start slave;
此時在3307和3308上再執行show slave status,可以看到
mysql> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event #等待主庫發送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 #狀態變為YES
Slave_SQL_Running: Yes #狀態變為YES
Replicate_Do_DB:
Replicate_Ignore_DB:
...omitted....
Seconds_Behind_Master: NULL
...omitted....
此時再查看主庫3306的狀態
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個線程執行了Binlog Dump命令,這就是我們的兩個從庫已經開始復制。
現在在主庫3306上創建一個庫draon_ha,在其中創建一個表user,并插入一條記錄,這數據都會自動同步到兩個從庫中
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兩個從庫中執行以下命令,查看數據是否已經同步:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dragon_ha |#插入的庫已經同步
| 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 |#插入的表已經同步
+---------------------+
1 row in set (0.00 sec)
mysql> select * from user;
+----+-------------+
| id | name |
+----+-------------+
| 1 | tianshouzhi |#插入的記錄已經同步
+----+-------------+
1 row in set (0.00 sec)
總結
以上是生活随笔為你收集整理的mysql multi主从复制_mysqld_multi方式配置Mysql数据库主从复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手持巡检仪_专业的三防产品设计-电力巡检
- 下一篇: 如何在Win11重置系统中保留个人文件