zoukankan      html  css  js  c++  java
  • MYsql 主从复制

    一 安装MYSQL  

    下载mysql-5.5.52-linux2.6-x86_64.tar.gz到/usr/local/src/
    cd /usr/local/src/
    tar zxvf mysql-5.5.52-linux2.6-x86_64.tar.gz
    [root@localhost src]# mv mysql-5.5.52-linux2.6-x86_64 /usr/local/mysql
    [root@localhost src]# useradd -s /sbin/nologin mysql
    [root@localhost src]# cd /usr/local/mysql
    [root@localhost mysql]# mkdir -p /data/mysql ; chown -R mysql:mysql /data/mysql
    [root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
    Installing MySQL system tables...
    [root@localhost mysql]# cp support-files/my-large.cnf /etc/my.cnf
    [root@localhost mysql]# vim /etc/my.cnf
    [root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
    [root@localhost mysql]# vim /etc/init.d/mysqld
    [root@localhost mysql]# /etc/init.d/mysqld start
    [root@localhost mysql]# /usr/local/mysql/bin/mysql -uroot

    主用户名: root   密码 mroot    192.168.128.133  

    从用户名:root    密码 sroot     192.168.128.134

    主从同步的用户名 repl   密码 123456

    配置命令后  /usr/local/mysql/bin/mysql   直接用 mysql 命令

    [root@localhost ~]# PATH=$PATH:/usr/local/mysql/bin
    [root@localhost ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    [root@localhost ~]# source /etc/profile

    主从上都创建数据库 testdb:

    主:

    mysql> create database testdb;

    主导数据给testdb,先导出到123.sql  再将 123.sql导入给testdb;

    [root@localhost mysql]# /usr/local/mysql/bin/mysqldump -uroot mysql > 123.sql
    -- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
    [root@localhost mysql]# /usr/local/mysql/bin/mysql -uroot testdb < 123.sql

    从:

    mysql> create database testdb;

    [root@localhost ~]# cd /usr/local/mysql
    [root@localhost mysql]# scp root@192.168.128.133:/usr/local/mysql/123.sql /usr/local/mysql/
    [root@localhost mysql]# mysql -uroot -psroot
    [root@localhost mysql]# mysql -uroot -psroot testdb < 123.sql

    二 

    1、主从服务器分别作以下操作:
    1.1、版本一致
    1.2、初始化表,并在后台启动mysql
    1.3、修改root的密码  

    主: mysqladmin -uroot password 'mroot'

    从: mysqladmin -uroot password 'sroot'

    一、 修改主服务器master:
    #vi /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin //[必须]启用二进制日志
    server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

    除了这两行是必须的外,还有两个参数,你可以选择性的使用:

    binlog-do-db=testdb
    binlog-ignore-db=databasename1,databasename2
    binlog-do-db=需要复制的数据库名,多个数据库名,使用逗号分隔。binlog-ignore-db=不需要复制的数据库库名,多个数据库名,使用逗号分隔。这两个参数其实用一个就可以啦。

    二、 修改从服务器slave:
    #vi /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin //[不是必须]启用二进制日志
    server-id=2 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

    找到 “server-id = 1” 这一行,改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。

    另外在从上,选择性的增加如下其中一行,对应于主上增加的那行:

    replicate-do-db=testdb
    replicate-ignore-db=databasename1,databasename2

    三、 /etc/init.d/mysql restart

    四、主服务器:

    [root@localhost mysql]# mysql -uroot -pmroot

    mysql> grant replication slave on *.* to 'repl'@'192.168.128.134' identified by '123456'; 

    mysql> flush tables with read lock;    先锁定主数据库 

    mysql> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000004 |      401 | testdb       |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    
    mysql
    > unlock tables; // 去从那配完再解锁
    Query OK, 0 rows affected (0.00 sec)

    [root@localhost mysql]# iptables -F     //主服务器要关闭防火墙,要不然从会    Slave_IO_Running: Connecting

    五、从服务器:

    [root@localhost mysql]# mysql -uroot -psroot

    mysql> change master to master_host='192.168.128.133',
    -> master_user='repl',master_password='123456',                //与上面的grant replication对应。
    -> master_log_file='mysql-bin.000004',master_log_pos=401;

    六、 mysql> unlock tables;         //主那解锁

    七、从服务器 开启方从服制 

    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)

    mysql> show slave statusG

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.128.133
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 401
                   Relay_Log_File: localhost-relay-bin.000002
                    Relay_Log_Pos: 253
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: Yes     // 这里要yes 主服务器要关闭防火墙 iptables -F
                Slave_SQL_Running: Yes     // 这里要yes
                  Replicate_Do_DB: testdb
              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: 401
                  Relay_Log_Space: 413
                  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: 1
    1 row in set (0.00 sec)

     测试同步: 清空主数据库testdb 里的表 db

    [root@localhost mysql]# mysql -uroot -pmroot
    mysql> use testdb;
    mysql> select count(*) from db;
    +----------+
    | count(*) |
    +----------+
    |        2 |
    +----------+
    1 row in set (0.00 sec)
    mysql> truncate table db;
    mysql> select count(*) from db;
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.00 sec)

    此时进从服务器  查看 db 应该为0 

    [root@localhost mysql]# mysql -uroot -psroot
    mysql> use testdb;
    mysql> select count(*) from db;
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.00 sec)

     遇见问题:

    导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:1、网络不通    2、密码不对  3、pos不对  4、 server-id

    发现服务器本地没有监听 3306    : netstat -an | grep 3306     注掉 skip-networking 就可以了。

     当主重启MYSQL 后 发现从Slave_SQL_Running: No

    SET GLOBAL SQL_SLAVE_SKIP_COUNTER=N;  (N=1  或大于 1 )  指让从跳过多少个事件。  因为之前有事件执行失败。    

  • 相关阅读:
    String的equals和hashCode方法
    查看oracle中表的索引
    初识RESTful
    linux安装字体库(simSun为例)
    排序之快排(JS)
    面向对象的三个基本特征 和 五种设计原则
    排序之希尔排序(JS)
    关于正则表达式
    Oracle 表分区介绍与使用
    一个复杂关联的sql
  • 原文地址:https://www.cnblogs.com/carbon3/p/5864777.html
Copyright © 2011-2022 走看看