zoukankan      html  css  js  c++  java
  • MySQL 5.7主从搭建(同一台机器)

    主从复制原理:复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例。
    1)主服务器将所有数据和结构更改记录到二进制日志中。
    2)从属服务器从主服务器请求该二进制日志并在本地应用其内容。
    3)IO:请求主库,获取上一次执行过的新的事件,并存放到relaylog
    4)SQL:从relaylog中将sql语句翻译给从库执行
    本次搭建在同一台机器上搭建,用不同用户和不同端口以及不同程序路径。安装过程比较简单,采用二进制的方式来做的。
    
    主库搭建:
    
    加入环境变量:

    export  MYSQL_HOME=/opt/mysql
    export  PATH=$PATH:$MYSQL_HOME/bin
    主库的配置文件:
    [mysql]
    no-auto-rehash
    port    = 3306
    socket  = /opt/data/mysqld.sock
    [mysqld]
    user    = mysql
    port    = 3306
    basedir = /opt/mysql
    datadir = /opt/data
    socket  = /opt/data/mysqld.sock
    pid-file = mysql.pid
    character-set-server = utf8
    skip_name_resolve = 1
    lower_case_table_names=1
    max_connections = 1000
    max_connect_errors = 1000000
    table_open_cache = 4000
    table_definition_cache = 4000
    table_open_cache_instances = 64
    max_allowed_packet = 32M
    sort_buffer_size = 16M
    join_buffer_size = 16M
    thread_cache_size = 450
    query_cache_size = 0
    query_cache_type = 0
    interactive_timeout = 600
    wait_timeout = 600
    tmp_table_size = 96M
    max_heap_table_size = 96M
    general_log=1
    general_log_file=general.log
    slow_query_log = 1
    slow_query_log_file = /opt/log/slow.log
    log_error = /opt/log/error.log
    long_query_time =1
    server-id = 170
    log_bin = mysql-bin
    log_slave_updates=on
    sync_binlog = 1
    binlog_cache_size = 4M
    max_binlog_cache_size = 2G
    max_binlog_size = 1G
    expire_logs_days = 7
    master_info_repository = TABLE
    relay_log_info_repository = TABLE
    binlog_format = row
    key_buffer_size = 32M
    read_buffer_size = 8M
    read_rnd_buffer_size = 16M
    lock_wait_timeout = 3600
    innodb_thread_concurrency = 0
    transaction_isolation = REPEATABLE-READ
    innodb_buffer_pool_size = 2G
    innodb_buffer_pool_instances = 8
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 32M
    innodb_log_file_size = 2G
    innodb_log_files_in_group = 3
    
    当时启动主库的时候会有个错误:

    查看error.log后:

    原因是配置参数的问题,自动扩展配置参数设置的太大导致。

    主库初始化:mysqld --initialize --user=mysql --datadir=/opt/data --basedir=/opt/mysql --socket=/opt/data/mysqld.sock
    
    bin/mysql_install_db --user=mysql  --basedir=/usr/local/mysql  --datadir=/mydata/data        # Before MySQL 5.6
    
     bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql  --datadir=/mydata/data      # MySQL 5.7 and up
    
    update mysql.user set authentication_string=password('L*Rb0!gtigergao!@#') where user='root' and Host = 'localhost'
    
    
    初始化主库后启动mysql服务进行登录,必须要先修改密码:
    ALTER USER "root"@"localhost" IDENTIFIED BY "shsnc!@#";
    flush privileges;

    登录主库创建主从同步用户:
    create user 'tigergao' identified by 'tigergao';

    赋权:grant replication slave on *.* to tigergao@'10.131.156.%' identified by 'tigergao';

    记录binlog位置:

    主库配置完毕,需要进行配置从库。
    注意:由于我是在同一台机子上做的主从,主库采用的做了软链后用service mysql start的方式启动的,由于担心同时做软链会发生冲突,所以从库用命令的方式启动的。

    从库配置:

     加入环境变量

    export  MYSQL_HOME=/data/mysql
    export  PATH=$PATH:$MYSQL_HOME/bin
    
    从库的配置:
    [mysql]
    no-auto-rehash
    port    = 3309
    socket  = /data/data/mysqldbs.sock
    [mysqld]
    user    = mysql01
    port    = 3309
    basedir = /data/mysql
    datadir = /data/data
    socket  = /data/data/mysqldbs.sock
    pid-file = mysqldbs.pid
    character-set-server = utf8
    skip_name_resolve = 1
    lower_case_table_names=1
    max_connections = 1000
    max_connect_errors = 1000000
    table_open_cache = 4000
    table_definition_cache = 4000
    table_open_cache_instances = 64
    max_allowed_packet = 32M
    sort_buffer_size = 16M
    join_buffer_size = 16M
    thread_cache_size = 450
    query_cache_size = 0
    query_cache_type = 0
    interactive_timeout = 600
    wait_timeout = 600
    tmp_table_size = 96M
    max_heap_table_size = 96M
    general_log=1
    general_log_file=general.log
    slow_query_log = 1
    slow_query_log_file = /data/log/slow.log
    log_error = /data/log/error.log
    long_query_time =1
    server-id = 175
    relay-log-index=slave-relay-bin.index
    relay-log=slave-relay-bin
    log_slave_updates=on
    sync_binlog = 1
    binlog_cache_size = 4M
    max_binlog_cache_size = 2G
    max_binlog_size = 1G
    expire_logs_days = 7
    master_info_repository = TABLE
    relay_log_info_repository = TABLE
    binlog_format = row
    key_buffer_size = 32M
    read_buffer_size = 8M
    read_rnd_buffer_size = 16M
    lock_wait_timeout = 3600
    innodb_thread_concurrency = 0
    transaction_isolation = REPEATABLE-READ
    innodb_buffer_pool_size = 2G
    innodb_buffer_pool_instances = 8
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 32M
    innodb_log_file_size = 2G
    innodb_log_files_in_group = 3
    
    从库采用命令启动指定配置文件:
    /usr/local/mysql/bin/mysqld_safe --defaults-extra-file=/etc/my3306.cnf --datadir=/mysql3306 --user=mysql &
    从库初始化:
    mysqld --initialize --user=mysql01 --datadir=/data/data --basedir=/data/mysql --socket=/data/data/mysqldbs.sock
    从库启动:指定配置文件的方式启动
    /data/mysql/bin/mysqld_safe --defaults-extra-file=/data/mysql/conf/my.cnf --datadir=/data/data --basedir=/data/mysql --user=mysql01 &

    ps -ef | grep -i mysql |grep -v grep 查看进程,3306和3309都已经起来了。

    设置主从:

    设置主从:需要在从库上执行
    change master to master_host='主库ip';
    change master to master_port=3306;
    change master to msater_user='tigergao';
    change master to master_password='tigergao';
    change master to master_log_file='mysql-bin.000001';
    change master to master_log_pos=1097;
    开启主从:startslave

     

    在从库上查看sql线程和io线程是否成功应用,如果已应用代表就是成功了。show slave status \G;

    验证主从,在主库上创建数据库:tigergao;在数据库tigergao中创建一张学生表并插入数据。

    然后在从库上查看:

    可以看到从库已经把数据库和表以及数据都同步过来了。分别去查看主库和从库的数据目录下的数据。
    主从已经搭建成功。
    主从复制基本故障处理
    IO线程
    ++ 连接主库 ++
    1)user password ip port
    2)网络:不通,延时高,防火墙
    ++ 请求binlog ++
    1)binlog不存在或者损坏
    ++ 更新relay-log和master.info ++
    SQL线程
    1)relay-log出现问题
    2)从库做写入了
    操作对象已存在(create)
    操作对象不存在(insert update delete drop truncate alter)
    约束问题、数据类型、列属性
    处理方法一:
    #临时停止同步
    mysql> stop slave;
    #将同步指针向下移动一个(可重复操作)
    mysql> set global sql_slave_skip_counter=1;
    #开启同步
    mysql> start slave;
    处理方法二:
    #编辑配置文件
    vim /etc/my.cnf
    #在[mysqld]标签下添加以下参数
    slave-skip-errors=1032,1062,1007
    但是以上操作都是有风险存在的
    处理方法三:
    1)重新备份数据库,恢复到从库
    2)给从库设置为只读
    #在命令行临时设置
    mysql> set global read_only=1;
    #在配置文件中永久生效/etc/my.cnf
    read_only=1
    6.延时从库
    企业中一般会延时3-6小时
    延时从库配置方法
    从库操作
    #停止主从
    mysql>stop slave;
    #设置延时为180秒
    mysql>change master to master_delay = 180;
    #开启主从
    mysql>start slave;
    #查看状态
    mysql> show slave status \G
    SQL_Delay: 60
    3.延时从库停止方法
    #停止主从
    mysql> stop slave;
    #设置延时为0
    mysql> CHANGE MASTER TO MASTER_DELAY = 0;
    #开启主从
    mysql> start slave;
    关闭半同步:
    主库执行
    SET GLOBAL rpl_semi_sync_master_enabled = 0;
    SET GLOBAL rpl_semi_sync_master_wait_no_slave = 0;
    
    从库执行:
    SET GLOBAL rpl_semi_sync_slave_enabled = 0;

     建议大家有资源的话尽量在两台机器上实验,一台机器上容易有坑。

    作者:tigergao
    功不唐捐 玉汝于成
  • 相关阅读:
    ZOJ 3642 多重匹配 离散化.cpp
    POJ 1840 Eqs.cpp 【 Hash 】
    Hdu 4293 DP
    Hlg 1407 【最小点权覆盖】.cpp
    Hdu 3605 多重匹配
    POJ 2195 【二分图最佳匹配】.cpp
    Hdu 4292 Food.cpp 最大流+拆点
    POJ 3469 【最小割】.cpp
    limit_choices_to a value on a field in the same model Google Groups
    Django: limit_choices_to (Is this correct) Stack Overflow
  • 原文地址:https://www.cnblogs.com/tigergaonotes/p/11093811.html
Copyright © 2011-2022 走看看