• mysql-replication


    Auth: jin
    Date: 20140422

    参考:

    http://dev.mysql.com/doc/refman/5.1/zh/replication.html#replication-options
    http://dev.mysql.com/doc/refman/5.1/en/replication-options.html


    (一)两个全新的实例做master-slave
    1.master配置
    [root@master1 ~]# cat /etc/my.cnf
    [mysqld]
    datadir = /data/mysql/3306
    port = 3306
    socket = /data/mysql/3306/mysql.sock
    pid-file = /data/mysql/3306/mysql.pid

    #log
    log-error = /data/logs/mysql/3306_error.log
    long_query_time = 2
    slow-query-log-file = /data/logs/mysql/3306_slow.log

    log-bin = binlogs/mysql-bin
    binlog_format = ROW
    expire_logs_day =1 #过期时间 超过手动清除
    max_binlog_size =500M #每个文件大小
    binlog_cache_size=3M
    server-id = 33061

    Replication中还以通过一下选项来减少binlog数据量,来达到提到效率的目的,前两个用在Master端,后六个是用在Slave端的
    --binlog-do-db二进制日志记录的数据库(多个数据库用,分隔)
    --binlog-ignore-db二进制日忽略的数据库(多个数据库用,分隔)
    #但是如果在操作数据库之前,不使用use $dbname 那么所有的SQL都不会记录
    #如果使用了use $dbname,那么判断规则取决于这里的$dbname,而不是SQL中操作的库
    #记录到二进制日志知的内容配置 ,不用配置,默认全部,replication slave有控制复制库的参数

    在replication的slave端还有一下6个参数
    --replication-do-db设定需要复制的数据库(多个数据库用,分隔) (原来我以为是在master端控制复制的)
    --replication-ignore-db设定忽略复制的数据库(多个数据库用,分隔)
    --replication-do-table设定需要复制的表(多个表用,分隔)
    --replication-ignore-table设定忽略复制的表(多个表用,分隔)
    --replication-wild-do-table同replication-do-table功能一样,但是可以加通配符
    --replication-wild-ignore-table同replication-ignore-table功能一样,但是可以加通配符

    2.master初始化并启动
    mysql_install_db --datadir=/data/mysql/3306 --user=mysql

    3.master赋予复制权限
    mysql> grant REPLICATION SLAVE on *.* to 'repl'@'192.168.11.%' identified by 'replpwd';

    4.slave初始化并启动
    slave不用开启binlog

    5.同步
    1)获取master position
    mysql -S /data/mysql/mysql.sock --password=password -e"show master status;"
    2)slave上设置同步位置
    change master to MASTER_HOST='192.168.11.100',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='replpwd',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=106;
    3)启动slave
    mysql> start slave;
    4)查看slave状态
    mysql> show slave statusG;
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event #SHOW PROCESSLIST输出的State字段的拷贝 show processlist看到两个system user线程,一个是IO,一个是SQL线程
    #388 | dbslave | 192.168.201.2:44540 | NULL | Binlog Dump | 23567257 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL #这个master push binlog到slave的线程
    Master_Host: 192.168.11.100
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000004 #I/O线程当前正在读取的主服务器二进制日志文件的名称。
    Read_Master_Log_Pos: 106 #在当前的主服务器二进制日志中,I/O线程已经读取的位置。
    Relay_Log_File: mysql-relay-bin.000002 #SQL线程当前正在读取和执行的中继日志文件的名称。
    Relay_Log_Pos: 251 #在当前的中继日志中,SQL线程已读取和执行的位置
    Relay_Master_Log_File: mysql-bin.000004 #由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称。
    Slave_IO_Running: Yes ###I/O线程是否被启动并成功地连接到主服务器上,从master读取binlog写到slave的relay-binlog文件中
    Slave_SQL_Running: Yes ###SQL线程状态,从slave的relay-binlog文件解析成sql语句应用到slave数据库
    Replicate_Do_DB:
    Replicate_Ignore_DB: mysql,test,performance_schema #忽略复制的库
    Replicate_Do_Table:
    Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
    Last_Errno: 0 #被多数最近被执行的查询返回的错误数量
    Last_Error: #错误消息。
    Skip_Counter: 0 #最近被使用的用于SQL_SLAVE_SKIP_COUNTER的值
    Exec_Master_Log_Pos: 106 #来自master服务器的二进制日志的由SQL线程执行的上一个时间的位置(Relay_Master_Log_File)
    在主服务器的二进制日志中的(Relay_Master_Log_File,Exec_Master_Log_Pos)对应于在中继日志中的(Relay_Log_File,Relay_Log_Pos)[好像不是,好像对应Master_Log_File,Read_Master_Log_Pos]。
    Relay_Log_Space: 406 #所有原有的中继日志结合起来的总大小。
    Until_Condition: None #在START SLAVE语句的UNTIL子句中指定的值
    Until_Condition具有以下值:
    如果没有指定UNTIL子句,则没有值
    如果从属服务器正在读取,直到达到主服务器的二进制日志的给定位置为止,则值为Master
    如果从属服务器正在读取,直到达到其中继日志的给定位置为止,则值为Relay
    Until_Log_File和Until_Log_Pos用于指示日志文件名和位置值。日志文件名和位置值定义了SQL线程在哪个点中止执行。
    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
    本字段是从属服务器“落后”多少的一个指示。当从属SQL线程正在运行时(处理更新),本字段为在主服务器上由此线程执行的最近的一个事件的时间标记开始,已经过的秒数。
    当此线程被从属服务器I/O线程赶上,并进入闲置状态,等待来自I/O线程的更多的事件时,本字段为零。总之,本字段测量从属服务器SQL线程和从属服务器I/O线程之间的时间差距,
    单位以秒计。
    Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:
    1 row in set (0.00 sec)
    http://blog.csdn.net/shiqidide/article/details/7263652

    (二)已有的实例 扩展成master-slave
    在线操作
    1.master授权slave复制和dump
    复制
    grant REPLICATION SLAVE on *.* to 'repl'@'192.168.100.%' identified by 'replpwd';
    dump
    grant all on dbtest.* to 'dbslave'@'192.168.100.%' identified by 'dbslavepwd';
    grant all on dbtest2.* to 'dbslave'@'192.168.100.%' identified by 'dbslavepwd';

    2.master开启binlog
    1)配置打开binlog
    #vim /etc/my.cnf
    log-bin=mysql-bin
    binlog_format = ROW
    #binlog_format=mixed
    expire_logs_day=1
    max_binlog_size=500M
    binlog_cache_size=3M
    replicate-ignore-db = mysql
    replicate-ignore-db = test
    replicate-ignore-db = performance_schema
    replicate-ignore-db = information_schema
    server-id = 33061

    注意server-id定义
    2)重启服务生效
    /etc/init.d/mysql restart
    mysql> SHOW PLUGINS;
    +------------+--------+----------------+---------+---------+
    | Name | Status | Type | Library | License |
    +------------+--------+----------------+---------+---------+
    | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |

    3.准备slave服务器
    slave不用开启binlog
    1)测试赋值账号连接
    mysql -h192.168.100.10 -P3306 -urepl -preplpwd
    2)配置server-id
    server-id = 33062
    要比master大
    3)配置复制账号
    mysql> stop slave;
    mysql> change master to MASTER_HOST='192.168.100.10',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='replpwd'
    先配置好账号密码,不然后面的file和position信息无法写入
    确认配置
    mysql> show slave statusG
    *************************** 1. row ***************************
    Slave_IO_State:
    Master_Host: 192.168.100.10
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File:
    Read_Master_Log_Pos: 4
    Relay_Log_File: mysqld-relay-bin.000001
    Relay_Log_Pos: 4
    Relay_Master_Log_File:
    Slave_IO_Running: No
    Slave_SQL_Running: No
    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: 0
    Relay_Log_Space: 106
    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: NULL
    Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:
    1 row in set (0.00 sec)

    4.在线直接从master dump到slave,并启动slave
    1)测试dump账号
    mysql -h192.168.100.10 -udbslave -pdbslavepwd -P3306 dbtest
    2)导入
    $ mysqldump -h192.168.100.10 -udbslave -pdbslavepwd -P3306 --master-data --databases dbtest dbtest2|mysql -u root -p -h 127.0.0.1 -P 3306
    dump默认-opt参数会锁库锁表,保证dump点数据一致性
    $ mysql -u root -p -h 127.0.0.1 -P 3306
    确认一下配置
    mysql> show slave statusG
    *************************** 1. row ***************************
    Slave_IO_State:
    Master_Host: 192.168.100.10
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000002 #增加部分
    Read_Master_Log_Pos: 237 #增加部分
    Relay_Log_File: mysqld-relay-bin.000001
    Relay_Log_Pos: 4
    Relay_Master_Log_File: mysql-bin.000002 #增加部分
    Slave_IO_Running: No
    Slave_SQL_Running: No
    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: 237 #增加部分
    Relay_Log_Space: 106
    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: NULL
    Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:
    1 row in set (0.00 sec)
    增加部分
    Master_Log_File: mysql-bin.000002 #增加部分
    Read_Master_Log_Pos: 237 #增加部分
    Relay_Master_Log_File: mysql-bin.000002 #增加部分
    Exec_Master_Log_Pos: 237 #增加部分
    这四个信息和master的 file,position有关了

    3)启动slave
    start slave
    mysql> show slave statusG
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    4)测试
    master
    insert into t2(name) values ('bing');
    slave
    mysql> select * from t2 where name='bing';
    +----+------+
    | id | name |
    +----+------+
    | 3 | bing |
    +----+------+
    1 row in set (0.00 sec)

    5. --master-data补充说明
    在做主从dump数据加上--master-data,也就是--master-data=1
    mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,
    file和position记录的位置就是slave从master端复制文件的起始位置。CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000084', MASTER_LOG_POS=725240484
    然后start slave即可

    (三)双主-互为主从
    http://www.cnblogs.com/diege/p/3355875.html

    (四)清空slave配置,重新同步
    1.停止slave,清空position
    mysql> stop slave;
    状态
    Slave_IO_Running: No
    Slave_SQL_Running: No
    mysql> reset slave;
    状态
    Master_Log_File: 没有了
    Read_Master_Log_Pos: 4 #从master位置变成slave位置了
    Relay_Log_File: mysqld-relay-bin.000001 #从master的变成slave的文件里
    Relay_Log_Pos: 4
    Relay_Master_Log_File:
    Exec_Master_Log_Pos: 0 #变0了

    2.清空后可以重新配置
    master
    全局只读锁
    mysql> FLUSH TABLES WITH READ LOCK;
    获取master信息
    mysql> show master status;
    +------------------+----------+--------------+------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000003 | 332 | | |
    +------------------+----------+--------------+------------------+
    slave 重新同步
    change master to MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=332;
    mysql> start slave;
    确认
    mysql> show slave statusG
    master解锁
    mysql> unlock tables;

  • 相关阅读:
    约数个数 和 约数之和
    二分模板
    新生赛补题
    codefores刷题心得3 思维+dp(特别好玩)
    二叉树的遍历及例题
    团队作业七——团队作业分配
    WarPlane——游戏设计文档
    团队作业(五)
    团队作业(四)
    团队项目方案分析
  • 原文地址:https://www.cnblogs.com/diege/p/3681980.html
Copyright © 2020-2023  润新知