目标:搭建mysql-32主机的数据库,实现两台主机的数据库主从复制。
架构

搭建从服务器:

一、搭建好mysql-32主机的相关配置(网卡、yum源)。并且在mysql-31中做一份完全备份。

二、从mysql-31中移植绿色版数据库到mysql-32主机中,并且补充相关的包:
[root@Mysql-31 /usr/local]# scp -r mysql57/ 192.168.1.32:/usr/local/
[root@Mysql-31 /usr/local]# scp -r boost/ 192.168.1.32:/usr/local/
[root@mysql-32 /usr/local]# yum -y install gcc-c++ ncurses-devel cmake

三、创建mysql用户:
[root@mysql-32 /usr/local]# groupadd -g 27 mysql
[root@mysql-32 /usr/local]# useradd -u 27 -g mysql -M -s /sbin/nologin mysql

四、拷贝mysql配置文件,并且到从服务器修改mysql配置文件:
[root@Mysql-31 ~]# scp /etc/my.cnf 192.168.1.32:/etc/
修改从服务器mysql配置文件:

1
2
3
4
5
6
7
[root@mysql-32 /data]# vim /etc/my.cnf

##server-id不能一样,不然影响主从复制
server-id=32
##开启中继日志,主从复制参考的日志文件
relay-log=/log-bin/relay-log-bin
relay-log-index=/log-bin/relay-log-bin.index

五、把mysql-31的完全备份数据复制到mysql-32的数据目录中,并且修改相关权限:
[root@Mysql-31 /backup]# scp mysql-2019-09-23-18-57-48.tar.gz 192.168.1.32:/data/mysql/

1
2
3
4
5
6
7
8
9
10
11
[root@mysql-32 /data/mysql]# ls
mysql-2019-09-23-18-57-48.tar.gz
[root@mysql-32 /data/mysql]# tar xf mysql-2019-09-23-18-57-48.tar.gz
[root@mysql-32 /data/mysql]# ls
mysql-2019-09-23-18-57-48.tar.gz tmp-mysql
[root@mysql-32 /data/mysql]# mv tmp-mysql/* .
[root@mysql-32 /data/mysql]# rm -rf mysql-2019-09-23-18-57-48.tar.gz tmp-mysql/
[root@mysql-32 /data/mysql]# ls
auto.cnf class ib_buffer_pool ib_logfile1 mysql.pid sys
backup-my.cnf error.log ibdata1 ibtmp1 performance_schema xtrabackup_binlog_pos_innodb
BBS hello ib_logfile0 mysql slow.log xtrabackup_info

此时数据准备就绪,但还是要注意两点:
应该查看所有数据的所属者是不是mysql用户
修改/data/mysql目录下的auto.cnf文件,使两个UUID不一样

七、因为在配置文件中开启了二进制日志,所有也要创建相应文件夹:
[root@mysql-32 /]# mkdir log-bin
[root@mysql-32 /]# chown mysql:mysql log-bin/

八、启动数据库,注意此时还未开启主从复制功能,需要保持两个数据库数据一样,否则可能会发生错误:
[root@mysql-32 /data/mysql]# /usr/local/mysql57/support-files/mysql.server start

开启主从复制功能:

预防错误操作:

停止从服务复制操作,默认情况下,mysql启动服务时,如果有slave状态存在,会自启:
mysql> stop slave;
清空主库信息,重新初始化中继日志序列:
mysql> reset slave;
设置复制主服务的配置(二进制的位置应该在主服务中查询:mysql>show mater status):
mysql> change master to master_host=’192.168.1.31’,master_user=’li’,master_password=’123’,master_log_file=’mysql-bin.0000411’,master_log_pos=679;
开启主从复制:
mysql> start slave;

主服务器验证

查看当前登录数据库的用户:
mysql> mysql> show processlist;
架构

从服务器验证

在主服务器中插入数据,然后在从服务器从可以查询到该数据
架构

注意事项

从服务器应该开启只读功能,防止用户在从数据库中插入数据,不然可能会由于主键冲突等原因导致复制成功。
例子:
从服务器中插入:

1
mysql> insert into hello.test1 values(11,'f',12);

主服务器中插入:

1
mysql> insert into hello.test1 values(11,'f',13);

注:该表第一个字段为主键
恢复方法:删除从服务器中的数据,重新启动主从复制功能
这只能在一般情况下可惜,本次因为该表拥有一个触发器与外表关联,无论何种操作都不能执行成功从主服务器中读取的二进制日志。最后只能手动同步这些数据,然后重置主从复制服务。重新设置复制主服务的配置
再次查看从服务器状态:
show slave status

开启只读功能,在配置文件中添加:

1
2
3
4
5
6
## 除了root@localhost 之外的用户操作均阻塞
read_only=ON
## 超级用户操作也会受阻
uper_read_only=ON
## 从服务器在有主信息存在的情况下,启动服务时,是否自动 start slave,默认是允许
skip-slave-start=ON

数据库配置文件参考

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
63
64
65
66
67
[client]
port=3306
user=root
password=123
socket=/tmp/mysql.sock


[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
symbolic-links=0
#skip-grant-tables
default_storage_engine=innodb
##事务隔离级别,可重读
transaction-isolation=REPEATABLE-READ
##密码过期时间,90天
default_password_lifetime=90
##最大连接数
max_connections=500

##数据库内存缓冲池大小
innodb_buffer_pool_size=500M
##开启独立表空间
innodb_file_per_table=ON
innodb_data_home_dir=/data/mysql
##设置共享表空间大小,当满足12M时自动生成另一个共享表空间文件
innodb_data_file_path=ibdata1:12M:autoextend

## 事务日志在数据库内存缓冲池中的大小
innodb_log_buffer_size=16M
##事务日志大小(redo日志)
innodb_log_file_size=50M
##事务日志的份数
innodb_log_files_in_group=2
innodb_log_group_home_dir=/data/mysql
##事务提交完成的三种方式
innodb_flush_log_at_trx_commit=2
innodb_flush_log_at_timeout=1
innodb_page_cleaners=1
innodb_page_size=16384
innodb_max_dirty_pages_pct=75


query_cache_size=128M
query_cache_type=OFF
query_cache_wlock_invalidate=OFF

log-bin=/log-bin/mysql-bin
server-id=31
binlog_format=row
binlog_rows_query_log_events=OFF
max_binlog_size=1073741824
expire_logs_days=0

log-error=/data/mysql/error.log
log_timestamps=system

general_log=OFF
log_output=file
general_log_file=/data/mysql/general.log

slow_query_log=ON
slow_query_log_file=/data/mysql/slow.log
long_query_time=0.10000

pid-file=/data/mysql/mysql.pid
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

最后更新: 2019年10月05日 10:07

原始链接: https://LiYuanSh.github.io/2019/09/23/运维实战-从数据库实现/

× 请我吃糖~
打赏二维码