MySQL优化之主从复制

概念

影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中。
假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的3306端口,通过网络发给MYSQL-B。
MYSQL-B收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库中完成。
那么,MYSQL-A的变化,MYSQL-B也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication。

解决问题

数据如何不被丢失
备份
读写分离
数据库负载均衡
高可用

服务器准备

10.3.136.128 	主服务器 master
10.3.136.129	从服务器slave

为了简化MySQL的安装,我这里使用的docker-compose启动服务器
docker-compose.yml的内容为

version: '3.1'
services:
  db:
    # 目前 latest 版本为 MySQL8.x
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - ./data:/var/lib/mysql  # 这里主要是为了将容器中的数据持久化到磁盘上

然后运行容器
在这里插入图片描述
使用Navicat远程连接数据库
在这里插入图片描述
修改主服务器的配置
1、进入容器虚拟机
在这里插入图片描述
找到my.cnf
在这里插入图片描述
在my.cnf中插入

server_id=128  ###服务器id
log-bin=mysql-bin   ###开启日志文件

服务器id唯一

在这里插入图片描述
为什么不用vi/vim
因为docker配置是容器最简启动配置,没有这两个命令
在这里插入图片描述
查询一下
MySQL优化之主从复制_第1张图片
当然,最好的解决方法是将my.cnf这个文件持久化到我们磁盘,这样我们就能直接在宿主机上进行操作,但是,目前对这个文件持久化的时候出现我还无法解决的问题,所以,只能使用这种方法,这里先将my.cnf配置文件放在这里,方便以后操作

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

重启服务器
docker restart 容器id

查询 服务器id

建立查询后输入:SHOW VARIABLES LIKE 'server_id'
在这里插入图片描述

查询服务器信息

输入:show master STATUS
在这里插入图片描述
如果能查询到,主服务器就算配置完成
如果结果为null,则主服务器my.cnf没有配置好.

修改从(slave)服务器

同样,在重服务器中的my.cnf添加

server_id=129 # 这个为服务id,在集群中必须唯一
log-bin=mysql-bin
binlog_do_db=test # 这个为你连接的数据库

在这里插入图片描述
MySQL优化之主从复制_第2张图片
添加成功

重启服务

docker restart 容器id

主服务器给从服务器账号授权

输入:GRANT REPL ICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456';

实际开发中,我们需要为主服务器授权,这图省事,直接使用root进行访问

//一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

重服务器请求同步

先在主服务中查询状态

show master STATUS

开启同步之前先停止同步
stop slave
配置同步

change master to master_host='10.3.136.128',master_user='root',master_password='123456',
         master_log_file='mysql-bin.000001',master_log_pos=155;
           master_log_file,master_log_pos为你在主数据库使用show master STATUS命令查询到了数据
         

开启同步
start slave

如果执行上面三个命令有错则在从数据库执行

set sql_mode = ‘’;
set sql_mode = ‘NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES’;

my.cnf的主要配置

[client]
default-character-set=utf8    #客户端连接编码

[mysql]
auto-rehash                   #客户端tab补全
default-character-set=utf8    #编码

[mysqld] 
user=mysql
port=3307                     #定义端口
log-bin=mysql-bin             #开启二进制日志
server-id=011                 #定义服务ID

max_allowed_packet=50M        ###最大
wait_timeout=3600             ###等待超时默认s
interactive_timeout=3600      ###活动超时

innodb_buffer_pool_size = 128M
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M

basedir=/tmp/mysql_mulit                 #MYSQL根目录
datadir=/tmp/mysql_mulit/data_3307       #MYSQL数据存放目录
socket=/tmp/3307_mysql.sock              #套接字

init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8                #定义数据库默认字符 server\collation
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

symbolic-links=0

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

lower_case_table_names = 0             #对表的大小写不敏感

[mysqld_safe]
log-error=/tmp/3307_err.log              #错误日志
pid-file=/tmp/mysql_mulit/data_3307/mysqld.pid   #pid,多协议通信 tcp/sock

你可能感兴趣的:(mysql优化)