mysql master slave

1. 创建mysql用户

1
[root@192 ~]# useradd -s /sbin/nologin mysql

2. 编译安装mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@192 ~]# wget http://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.35.tar.gz
[root@192 ~]# tar xzf mysql-5.6.35.tar.gz
[root@192 ~]# cd mysql-5.6.35
[root@192 mysql-5.6.35]# cmake \
> -DCMAKE_INSTALL_PREFIX=/mnt/app/mysql \
> -DWITH_MYISAM_STORAGE_ENGINE=1 \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
> -DENABLED_LOCAL_INFILE=1 \
> -DWITH_PARTITION_STORAGE_ENGINE=1 \
> -DEXTRA_CHARSETS=all \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DENABLE_DOWNLOADS=1
[root@192 mysql-5.6.35]# make
[root@192 mysql-5.6.35]# make install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cmake ./
# -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装路径
# -DMYSQL_DATADIR=/usr/local/mysql/data \ #数据文件存放位置
# -DSYSCONFDIR=/etc \ #my.cnf路径
# -DWITH_MYISAM_STORAGE_ENGINE=1 \ #支持MyIASM引擎
# -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #支持InnoDB引擎
# -DWITH_MEMORY_STORAGE_ENGINE=1 \ #支持Memory引擎
# -DWITH_READLINE=1 \ #快捷键功能(我没用过)
# -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \ #连接数据库socket路径
# -DMYSQL_TCP_PORT=3306 \ #端口
# -DENABLED_LOCAL_INFILE=1 \ #允许从本地导入数据
# -DWITH_PARTITION_STORAGE_ENGINE=1 \ #安装支持数据库分区
# -DEXTRA_CHARSETS=all \ #安装所有的字符集
# -DDEFAULT_CHARSET=utf8 \ #默认字符
# -DDEFAULT_COLLATION=utf8_general_ci

3. 设置环境变量

1
2
3
4
[root@10 mysql-5.6.35]# echo 'export MYSQL_BASE=/mnt/app/mysql' |tee /etc/profile.d/mysql.sh
[root@10 mysql-5.6.35]# echo 'export MYSQL_BIN=$MYSQL_BASE/bin' |tee -a /etc/profile.d/mysql.sh
[root@10 mysql-5.6.35]# echo 'export PATH=$MYSQL_BIN:$PATH' |tee -a /etc/profile.d/mysql.sh
[root@10 mysql-5.6.35]# source /etc/profile

4. 创建数据和日志存放目录

1
2
3
4
[root@192 mysql-5.6.35]# mkdir -p /mnt/data/mysql/{3306,3307}
[root@192 mysql-5.6.35]# mkdir -p /mnt/log/mysql/{3306,3307}
[root@192 mysql-5.6.35]# touch /mnt/log/mysql/{3306,3307}/mysqld.log
[root@192 mysql-5.6.35]# chown -R mysql.mysql /mnt/{data,log}/mysql

5. 初始化数据库

1
2
3
[root@192 mysql-5.6.35]# chmod +x scripts/*
[root@192 mysql-5.6.35]# ./scripts/mysql_install_db --basedir=/mnt/app/mysql/ --datadir=/mnt/data/mysql/3306/ --user=mysql
[root@192 mysql-5.6.35]# ./scripts/mysql_install_db --basedir=/mnt/app/mysql/ --datadir=/mnt/data/mysql/3307/ --user=mysql

6.启动,关闭,连接

1
2
3
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysqld_safe --defaults-file=/mnt/app/mysql/conf/my_3306.cnf &
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysqladmin -S /mnt/data/mysql/3306/mysql.sock shutdown
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysql -S /mnt/data/mysql/3306/mysql.sock

6. Master 修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@192 mysql-5.6.35]# cat /mnt/app/mysql/conf/my_3306.cnf
[mysqld]
user = mysql
port = 3306
basedir = /mnt/app/mysql
datadir = /mnt/data/mysql/3306
socket = /mnt/data/mysql/3306/mysql.sock
default-storage-engine = InnoDB
character_set_server = utf8
max_connections = 2000
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

server-id = 111
log-bin = /mnt/log/mysql/3306/mysql-bin
expire_logs_days = 7
binlog_format = MIXED
max_binlog_size = 100m
binlog_cache_size = 4m
max_binlog_cache_size = 512m

innodb_file_per_table = 1

[mysqld_safe]
log-error=/mnt/log/mysql/3306/mysqld.log
pid-file =/mnt/app/mysql/mysqld.3306.pid

[client]
default-character-set=utf8
socket=/mnt/data/mysql/3306/mysql.sock

[mysql]
default-character-set=utf8
socket=/mnt/data/mysql/3306/mysql.sock

6. Master 启动,停止,连接服务

1
2
3
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysqld_safe --defaults-file=/mnt/app/mysql/conf/my_3306.cnf &
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysqladmin -S /mnt/data/mysql/3306/mysql.sock shutdown
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysql -S /mnt/data/mysql/3306/mysql.sock

7. Slave 修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@192 mysql-5.6.35]# cat /mnt/app/mysql/conf/my_3306.cnf
[mysqld]
user = mysql
port = 3306
basedir = /mnt/app/mysql
datadir = /mnt/data/mysql/3306
socket = /mnt/data/mysql/3306/mysql.sock
default-storage-engine = InnoDB
character_set_server = utf8
max_connections = 2000
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

server-id = 108
log-bin = /mnt/log/mysql/3306/mysql-bin
expire_logs_days = 7
binlog_format = MIXED
max_binlog_size = 100m
binlog_cache_size = 4m
max_binlog_cache_size = 512m

master-host = 192.168.1.111
master-user = repl
master-password = repl123
master-port = 3306
master-connect-retry = 60

innodb_file_per_table = 1

[mysqld_safe]
log-error=/mnt/log/mysql/3306/mysqld.log
pid-file =/mnt/data/mysql/3306/mysqld.pid

[client]
default-character-set=utf8
socket=/mnt/data/mysql/3306/mysql.sock

[mysql]
default-character-set=utf8
socket=/mnt/data/mysql/3306/mysql.sock

8. Slave 启动,停止,连接服务

1
2
3
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysqld_safe --defaults-file=/mnt/app/mysql/conf/my_3306.cnf &
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysqladmin -S /mnt/data/mysql/3306/mysql.sock shutdown
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysql -S /mnt/data/mysql/3306/mysql.sock

9. Master 创建同步用户

1
2
3
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysql -S /mnt/data/mysql/3306/mysql.sock
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl'@'%' identified by 'repl123';
mysql> flush privileges;

10. Master 锁表,查看binlog ID

1
2
3
4
5
6
7
8
9
10
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 397 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

11. Master 打开另一个终端进行备份数据库

1
[root@192 mysql-5.6.35]# mysqldump --all-databases --master-data > dbdump.db

12. Master 备份完数据库后,进行表解锁

1
mysql> UNLOCK TABLES;

13. Slave 将在Master上备份的数据库,在Slave服务器上还原

1
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysql -S /mnt/data/mysql/3306/mysql.sock < fulldb.dump

13. Slave 数据库还原后,登录到数据库,与Master进行binlog同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@192 mysql-5.6.35]# /mnt/app/mysql/bin/mysql -S /mnt/data/mysql/3306/mysql.sock
mysql> change master to master_host='192.168.1.111',master_port=3306,master_user='repl',master_password='repl123',master_log_file='mysql-bin.000001',master_log_pos=397;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.111
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 397 //同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes //必须是YES
Slave_SQL_Running: Yes //必须是YES
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 397
Relay_Log_Space: 457
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 111
Master_UUID: a2207dde-caaf-11e6-bc89-080027770ec0
Master_Info_File: /mnt/data/mysql/3306/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
ERROR:
No query specified

14. Master 登录mysql,进行验证主从同步是否正常