• MySQL主从复制


    测试环境:
    master: CentOS 6.6 (x86_64), MySQL5.6.22
    slave: Windows 8(x86_64), MySQL5.6.19
     
    相关名词:主从复制,读写分离,数据备份
     
    Replication允许将master数据库的数据复制到多个slave数据库上,replication默认是异步的,因此slave不需要永久的连接到master,slave可以不在线,一旦slave在线后,会把master最新的数据增量同步下来,replication允许复制整个database,或者某个database,或者某张表。
     
    1, 关闭master数据库,编辑master的/usr/my.cnf,my.ini,增加配置:
    [mysqld]
    log-bin=mysql-bin
    server-id=1
    
    innodb_flush_log_at_trx_commit=1
    
    sync_binlog=1
    
    重启mysql
    master配置参数
     
    2, 关闭slave数据库,编辑slave的my.ini,增加配置
    [mysqld]
    server-id=2
    
    #下面4行表示:将slave配置成其它slave的master
    
    #log-bin=mysql-bin
    #innodb_flush_log_at_trx_commit=1
    #sync_binlog=1
    #log_slave_updates=1 #slave将复制事件写入自己的bin-log,这样slave作为master的时候,其它slave就可以根据这些bin-log进行复制
    #replicate-ignore-db=test #不要复制test数据库
    #replicate-rewrite-db=db_name_a->db_name_b #在master上针对数据库db_name_a中的操作会被映射到slave的db_name_b数据库中的相应表。
    重启mysql
    slave配置参数
    :--replicate-rewrite-db: Only statements involving tables are affected (not statements such as CREATE DATABASEDROP DATABASE, and ALTER DATABASE)
     
    3, 在master上创建replication帐号
    mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';
    
    
    mysql> FLUSH PRIVILEGES;
     
    4, 获取master数据库binary log的名称和位置
    打开第一个master session将数据库锁定,只允许读操作
    mysql> FLUSH TABLES WITH READ LOCK;
     
    打开另一个master session, 查看binary log的name、position
    mysql > SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000003 | 73       | test         | manual,mysql     |
    +------------------+----------+--------------+------------------+
    
     
    如果你的master数据库之前没有使用binary log,这时候你看到的name和postion是空的,则在后面的操作中name='',position=4
     
    如果你的数据库已经有数据了,需要在replication之前就导入到slave中,请保持master读锁,使用mysqldump将master的数据导出来并导入到slave数据库中。具体请参考第5步。
     
    如果你的数据库之前没有数据,或者你不想要之前的数据了,则可以释放master锁,有2种方式释放:
    1)直接退出第一个session
    2)执行:
    mysql> UNLOCK TABLES;
    然后跳到第7节
     
    5, 在master上使用mysqldump创建数据快照
    说明:此节的目的是,如果master在replication之前已经有数据了,则需要在replication之前将这些数据从master数据库中导出,然后导入到slave数据库;这个操作完成之后就可以replication了;如果你的master之前没有数据,则跳过此节。
    在master机器的shell上,执行以下命令,将整个db导出到dbdump.db文件中。(加上--master-data则在导出时先锁定表,然后再导数据,最后释放锁)-uroot -p参数可选,是指定master数据库帐号密码用的
    shell> mysqldump -uroot -p --all-databases --master-data > dbdump.db
    6, 将数据导入到slave数据库
    -uroot -p参数可选,是指定slave数据库帐号密码用的
    shell> mysql -uroot -p < dbdump.db
     
    7, 在slave上设置master数据库连接信息
    mysql> CHANGE MASTER TO
        ->     MASTER_HOST='master_host_name',
        ->     MASTER_USER='replication_user_name',
        ->     MASTER_PASSWORD='replication_password',
        ->     MASTER_LOG_FILE='recorded_log_file_name',
        ->     MASTER_LOG_POS=recorded_log_position;
    注:重复设定之前需要执行:
    mysql> RESET SLAVE;
     
    8, 启动slave线程
    mysql> START SLAVE;
     
    9, 当你不想replication了,可以在slave上停止slave线程
    mysql> STOP SLAVE;
    停止后你也可以重新start slave,replication机制会自动将这段时间master上的数据更新同步到slave。
     
    10, 思考:
    在项目中我们可以利用replication实现数据库读写分离,从而提升服务器性能。master数据库用于写,slave数据库用于读。
     
    11, 参考资料:
     
    12, 
  • 相关阅读:
    Lua 脚本限制访问频率过高的IP
    h2:无法自动建库解决(H2 Database Engine)
    在保留所有列的pandas中获取每个类别的前n个值...
    python中使用多进程multiprocessing并获取子进程的返回值
    openresty nginx http状态码
    python process返回值_在多处理Python中从multiprocessing.Queue()返回值
    修改nginx的http响应头server字段
    mysql 保留两位小数
    Nginx location模块整理
    Python量化分析,计算KDJ (使用如下方法计算与国内财经软件显示一致)
  • 原文地址:https://www.cnblogs.com/java-koma/p/4161680.html
Copyright © 2020-2023  润新知