1.主从简介
在现代企业中,数据显得尤为重要,而存储数据的数据库选择又五花八门,但无论是何种数据库,均存在着一种隐患。
想几个问题:
用一台数据库存放数据,若此数据库服务器挂了导致数据丢失怎么办?
业务量大了,数据多了,访问的人多了,一台数据库无法保证服务质量了怎么办?
2.主从作用
实时灾备,用于故障切换
读写分离,提供查询服务
备份,避免影响业务
3.主从形式
一主一从
主主复制
一主多从---扩展系统读取的性能,因为读是在从库读取的
多主一从---5.7版本开始支持
联级复制
1.主库将所有的写操作记录到binlog日志中并生成一个log dump线程,通过log dump线程将binlog日志传给从库的I/O线程
2.从库生成两个线程,一个I/O线程,一个SQL线程
3.I/O线程去请求主库的binlog,并将得到的binlog日志写入到relay log (中继日志)文件中
4.SQL线程,会读取relay log 文件中的日志,并解析成具体操作,来实现主从的操作一致,达到最终数据一致的目的。
*5.主从复制配置
主从复制配置步骤:
1.确保从数据库与主数据库里的数据一样
2.在主数据库里创建一个同步账号授权给从数据库使用
3.配置主数据库(修改配置文件)
4.配置从数据库(修改配置文件)
环境说明:
数据库角色 | IP | 应用与系统版本 | 有无数据 |
---|---|---|---|
主数据库 | 192.168.209.12 | Centos7/redhat7/ mysql-5.7 | 无数据 |
从数据库 | 192.168.209.13 | Centos7/redhat7/ mysql-5.7 | 无数据 |
需求:搭建两台mysql服务器,一台作为主服务器192.168.209.12,一台作为从服务器192.168.209.13,主服务器进行写操作,从服务器进行操作。
说明://分别在主从两台服务器上安装mysql-5.7版本
** 主服务器和从服务器上分别都要安装mysql**
********************************mysql安装****************************
//关闭防火墙及selinux
//安装依赖 包
[root@lanzhiyong ~]# yum -y install ncurses-devel openssl-devel openssl cmake mariadb-devel
//创建用户和组
[root@lanzhiyong ~]# cd /usr/src/
[root@lanzhiyong src]# groupadd -r -g 306 mysql
[root@lanzhiyong src]# useradd -M -s /sbin/nologin -g 306 -u 306 mysql
//下载二进制格式的mysql软件包
[root@lanzhiyong src]# wget https://downloads.mysql.com/archives/get/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
//解压软件至/usr/local
[root@lanzhiyong src]# tar xf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@lanzhiyong src]# cd /usr/local/
//创建软连接
[root@lanzhiyong local]# ln -sv mysql-5.7.22-linux-glibc2.12-x86_64/ mysql
//修改目录/usr/local/mysql的属主属组
[root@lanzhiyong local]# chown -R mysql.mysql /usr/local/mysql
[root@lanzhiyong local]# ll /usr/local/mysql
//添加环境变量
[root@lanzhiyong ~]# ls /usr/local/mysql
[root@lanzhiyong ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
[root@lanzhiyong ~]# source /etc/profile.d/mysql.sh
[root@lanzhiyong ~]# echo $PATH
//建立数据存放目录
[root@lanzhiyong ~]# mkdir /opt/data
[root@lanzhiyong ~]# chown -R mysql.mysql /opt/data/
[root@lanzhiyong ~]# ll /opt/
总用量 0
drwxr-xr-x. 2 mysql mysql 6 8月 19 13:20 data
//初始化数据库 注意这个命令后会生成临时密码 要记住 jd?ajfrKY4pQ
[root@lanzhiyong ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/data/
//配置mysql
//软连接
[root@lanzhiyong ~]# ln -sv /usr/local/mysql/include/ /usr/local/include/mysql
[root@lanzhiyong ~]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
[root@lanzhiyong ~]# ldconfig -v
//生成配置文件
[root@lanzhiyong ~]# cat > /etc/my.cnf << EOF
> [mysqld]
> basedir = /usr/local/mysql
> datadir = /opt/data
> socket = /tmp/mysql.sock
> port = 3306
> pid-file = /opt/data/mysql.pid
> user = mysql
> skip-name-resolve
> EOF
//配置服务启动脚本
[root@lanzhiyong ~]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@lanzhiyong ~]# sed -ri 's#^(basedir=).*#\1/usr/local/mysql#g' /etc/init.d/mysqld
[root@lanzhiyong ~]# sed -ri 's#^(datadir=).*#\1/opt/data#g' /etc/init.d/mysqld
//启动mysql
[root@lanzhiyong ~]# service mysqld start
[root@lanzhiyong ~]# ps -ef |grep mysql
[root@lanzhiyong ~]# ss -antl
LISTEN 0 80 :::3306 :::*
//修改密码 使用临时密码登入
[root@lanzhiyong ~]# mysql -uroot -p
jd?ajfrKY4pQ 这是以上步骤的临时密码
mysql> set password = password('lanzhiyong');
#############查看主库有哪些库###################3
[root@lanzhiyong ~]# mysql -uroot -p
Enter password: //上面设置的密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.22 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
#####################查看从库有哪些库#############
[root@lan ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
###############现在在主服务上添加四个数据库########
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lan |
| lanzhiyong |
| mysql |
| performance_schema |
| sys |
| zhi |
+--------------------+
7 rows in set (0.00 sec)
//进入lanzhiyong数据库里添加一个lanzhi表
mysql> use lanzhiyong;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_lanzhiyong |
+----------------------+
| lanzhi |
+----------------------+
1 row in set (0.00 sec)
//查看表的内容
mysql> select * from lanzhi;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | lan | 10 |
| 2 | cs | 90 |
| 3 | lol | 66 |
| 4 | pp | 33 |
+----+------+------+
4 rows in set (0.00 sec)
//全备主库
//先退出之前的数据库,全备主库时需要另外打开一个终端,再开一台192.168.209.12 的服务器,给数据库加上读锁,避免在备份期间与其他人在写入导致数据不一致
//加上读锁之后只能读不能写
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.02 sec)
//备份主库将备份文件传送到从库
[root@lanzhiyong ~]# mysqldump -uroot -p --all-databases > all.sql
[root@lanzhiyong ~]# scp all.sql [email protected]:/root/
The authenticity of host '192.168.209.13 (192.168.209.13)' can't be established.
ECDSA key fingerprint is SHA256:lOImReX4QGLGm5Qibnn4osotw9PoMtSRGLRaK1JAs4w.
ECDSA key fingerprint is MD5:e4:1a:5f:28:d1:e0:2a:28:50:1a:1e:9c:cd:23:03:9d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.209.13' (ECDSA) to the list of known hosts.
[email protected]'s password:
all.sql 100% 784KB 24.4MB/s 00:00
//解除主库的锁表状态
mysql> quit
Bye
//从库 登入先 再读取主库传来的备份
[root@lan ~]# mysql -uroot -p
Enter password:
mysql> source all.sql;
#读取了之后 主库的所有数据在从库上确保一致
//在主数据库里创建一个同步账号授权给从数据库使用
mysql> create user 'repl'@'192.168.209.13' identified by 'repl123';
Query OK, 0 rows affected (0.01 sec)
//在主数据库授权复制给从数据库
mysql> grant replication slave on *.* to 'repl'@'192.168.209.13';
Query OK, 0 rows affected (0.00 sec)
//刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
##############配置主数据库###################
[root@lanzhiyong ~]# vi /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
log-error=/opt/data/mysql.log //添加错误日志目录
user = mysql
skip-name-resolve
#replication
log-bin=mysql_bin //添加启用binlog日志
server-id=3 //添加数据库服务器唯一标识符,主库的server-id值必须比从库的大
[root@lanzhiyong ~]# service mysqld restart
[root@lanzhiyong ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 80 :::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)
##################配置从数据库##################
[root@lan ~]# vi /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
log-error=/opt/data/mysql.log //添加错误日志目录
user = mysql
skip-name-resolve
#replication
server-id=5 //添加从库的唯一标识符,从库的server-id值必须小于主库的值
relay-log=mysql_relay_log //添加中继日志文件
[root@lan ~]# service mysqld restart
[root@lan ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 80 :::3306 :::*
//从库配置并启动从复制
mysql> change master to master_host='192.168.209.12',
master_user='repl',
master_password='repl123',
master_log_file='mysql_bin.000001',
master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
//查看从服务器状态
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.209.12
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: mysql_relay_log.000003
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql_bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: 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: 154
Relay_Log_Space: 740
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: 3
Master_UUID: 3bcb9f5a-b269-11e8-aeca-000c2947a37d
Master_Info_File: /opt/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
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
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
#######主库插入记录验证#########
//在主库里的lanzhiyong库里lanzhi表里添加几条记录,验证是否能同步
mysql> select from lanzhi;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | lan | 10 |
| 2 | cs | 90 |
| 3 | lol | 66 |
| 4 | pp | 33 |
+----+------+------+
4 rows in set (0.01 sec)
mysql> insert into lanzhi (id,name,age) values (5,'AA',23),(6,'BB',45),(7,'CC',100);
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings:
mysql> select from lanzhi;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | lan | 10 |
| 2 | cs | 90 |
| 3 | lol | 66 |
| 4 | pp | 33 |
| 5 | AA | 23 |
| 6 | BB | 45 |
| 7 | CC | 100 |
+----+------+------+
7 rows in set (0.00 sec)
############从库看是否同步###########3
mysql> select * from lanzhi;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | lan | 10 |
| 2 | cs | 90 |
| 3 | lol | 66 |
| 4 | pp | 33 |
| 5 | AA | 23 |
| 6 | BB | 45 |
| 7 | CC | 100 |
+----+------+------+
7 rows in set (0.01 sec)