• Mysql数据库的主从、读写


    一、Mysql的日志

    MySQL的配置文件:/etc/my.cnf
    查看MySQL的数据目录:show variables like '%datadir%';

    1.1、错误日志(error log)

    记录mysql服务的启动、服务异常,用于解决服务器故障;
    查看日志:show variables like '%log_error%';

    1.2、二进制日志(bin log)

    默认开启,记录更改数据的语句,用于数据同步和灾难时人工恢复数据;
    查看日志:show variables like '%log_bin%';
    查看二进制日志格式:show variables like '%binlog_format%';
    查看二进制日志过期时间:show variables like '%binlog_expire_logs_seconds%';

    1.3、一般查询日志(general log)

    默认关闭,记录客户端连接发送给数据库的操作指令
    查看日志:show variables like '%general%';

    1.4、慢查询日志

    记录执行时间超过long_query_time(默认10s)查询
    默认不记录不使用索引进行查找的查询。
    可用log_slow_admin_statements 和 更改此行为 log_queries_not_using_indexes。
        #记录执行较慢的管理语句
        log_slow_admin_statements =1
        #记录执行较慢的未使用索引的语句
        log_queries_not_using_indexes = 1
    查看日志:show variables like 'slow_query_log';

    1.5、中继日志(relay log)

    主从复制原理

    从库上日志,从库读取主库的二进制日志后写入中继日志,通过中继日志执行Sql。
    查看日志:show variables like '%relay%';

    1.6、事务日志(redo log和undo log)

    重做日志(redo log)
        在数据变更前先写入redo log。
    撤销日志(undo log)
        当一些变更执行到一半无法完成时,可根据撤销日志恢复到变更前。

    二、Mysql的主从复制

    主库内部有一个线程负责与从库的长连接。

    2.1、主从复制原理

    1.主库bin log二进制文件纪录所有增删改SQL语句(binlog线程)。
    2.从库把主数据库的bin log文件的SQL 复制到自己的中继日志 relay log(io线程)。
    3.从库的relay log重做日志文件,再执行一次这些sql语句(Sql执行线程)。

    2.2、复制类型

    1.全同步复制
    主库执行完一个事务之后,要所有从库也都执行完该事务,才返回处理结果给客户端,性能较低。

    2.异步复制
    主库提交事物后,发送binlog日志给从库,从库收到日志后不等从库同步完成事务,主库就将结果返回给客户端。性能高,数据一致性最差。

    3.半同步复制
    主库提交事物后等待至少有一个从库收到了Binlog,并写入到中继日志,再返回给客户端,提高了数据的一致性。
    参数:rpl_semi_sync_master_wait_for_slave_count,可对需要响应的从库数量进行设置,默认为1。

    4.增强半同步复制
    mysql 5.7.2后的版本对半同步复制的改进,原理一样,主要解决幻读问题。
    主库配置了参数 rpl_semi_sync_master_wait_point = AFTER_SYNC 后,
    主库在存储引擎提交事务前,须先收到从库数据同步完成的确认信息后,才提交事务,来解决幻读问题。

    2.3、bin log日志的格式

    语句级别的复制(statement-based replication,SBR):binlog记录SQL原文,主库和从库选的索引不一致,会导致数据不一致。
    行级别的复制(row-based replication,RBR):binlog日志记录SQL,还记录删除的主键ID信息、删除的行数,会很占空间。
    混合复制(mixed-based replication,MBR):row和statement格式混合使用,当数据可能不一致时,用row格式,否则用statement格式。

    三、MySQL8.0主从部署配置

    主机名    ip  角色
    c7-lab110.10.104.51
    c7-lab210.10.104.52

    3.1、安装两台MySQL数据库

    3.1.1、下载

    官网下载rpm bundle包上传到centos系统上。
    官网:https://dev.mysql.com/downloads/mysql 
     

    1. # 服务器上直接下载:
    2. wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 

    3.1.2、解压bundle包

    tar xvf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar

    3.1.3、卸载mariadb

    1. rpm -qa | grep mariadb
    2. rpm -e --nodeps mariadb-libs-*

    3.1.4、安装MySQL

    MySQL的rpm包

    rpm -ivh mysql-community-common-8.0.33-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm mysql-community-libs-8.0.33-1.el7.x86_64.rpm mysql-community-client-8.0.33-1.el7.x86_64.rpm mysql-community-icu-data-files-8.0.33-1.el7.x86_64.rpm mysql-community-server-8.0.33-1.el7.x86_64.rpm
    

    3.1.5、初始化MySQL并启动

    1. #初始化
    2. mysqld --initialize --console
    3. #授权mysql用户
    4. chown -R mysql:mysql /var/lib/mysql/
    5. 启动服务
    6. systemctl start mysqld
    7. systemctl enable mysqld
    8. #查看初始化密码
    9. cat /var/log/mysqld.log | grep localhost

    3.1.6、登录MySql、配置用户

    1. mysql -u root -p #带上初始化的密码
    2. #修改密码,开启远程
    3. #修改登录密码
    4. ALTER USER 'root'@'localhost' IDENTIFIED BY 'Csdn@123';
    5. #切换到mysql数据库
    6. use mysql;.
    7. #开启数据库远程管理
    8. update user set Host='%' where User='root';
    9. flush privileges;
    登录MySQL和配置用户
    修改密码,开启远程

    3.2、主从配置

    3.2.1、在主服务器(c7-lab1)上修改配置文件(my.cnf或my.ini)新增下面参数:

    1. cat >> /etc/my.cnf <
    2. #服务器 id,随意,但要唯一
    3. server-id = 1
    4. #二进制文件存放路径
    5. log-bin = mysql-bin
    6. #参数用于排除自带的数据库。
    7. binlog-ignore-db = mysql
    8. binlog-ignore-db = information_schema
    9. binlog-ignore-db = performance_schema
    10. #二进制日志格式,建议使用ROW格式以获得更好的兼容性和可靠性。
    11. binlog-format = ROW
    12. EOF
    13. #重启从服务以使配置更改生效。
    14. systemctl restart mysqld

    3.2.2、在主服务器的数据库中创建用于复制的账户并授予相应的权限

    1. #登录MySQL
    2. mysql -uroot -pCsdn@123
    3. use mysql;
    4. #创建用户
    5. CREATE USER 'db_sync'@'%' IDENTIFIED BY 'Csdn@123';
    6. #授权账号复制权限
    7. GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%';
    8. #刷新配置
    9. FLUSH PRIVILEGES;

    3.2.3、在主服务器上执行以下命令获取当前二进制日志文件的名称和位置

    SHOW MASTER STATUS;

    记下输出中的 File 和 Position 值,后续在从服务器上使用。 

    3.2.4、在从服务器(c7-lab2)上修改配置文件(my.cnf或my.ini),找到并编辑以下参数:

    1. cat >>/etc/my.cnf <
    2. server-id = 2
    3. #中继日志文件的名称,用于从主服务器接收二进制日志事件。
    4. relay-log = mysql-relay-bin
    5. #从服务器的二进制日志文件的名称。
    6. log_bin = mysql-bin
    7. #不同步相关的库
    8. replicate-ignore-db = mysql
    9. replicate-ignore-db = information_schema
    10. replicate-ignore-db = performance_schema
    11. EOF
    12. #重启MySQL服务
    13. systemctl restart mysqld

    3.2.5、登录从服务器(c7-lab2)MySQL上更据主服务器建立的账号和show master status;显示的内容,修改以下命令配置主从复制:(根据第3.2.3上的内容修改)

    1. STOP SLAVE;
    2. CHANGE MASTER TO
    3. MASTER_HOST = '10.10.104.51',
    4. MASTER_USER = 'db_sync',
    5. MASTER_PASSWORD = 'Csdn@123',
    6. #主服务器数据库上的file值(不能有空格)
    7. MASTER_LOG_FILE = 'mysql-bin.000001',
    8. #主服务器数据库的Position值
    9. MASTER_LOG_POS = 157,
    10. get_master_public_key=1;

    3.2.6、在在从服务器启动同步并查看状态

    1. #开启同步
    2. start slave;
    3. #查看同步状态
    4. SHOW SLAVE STATUS\G;

    Slave_IO_Running 、Slave_SQL_Running 两个字段的值都是 Yes,表示主从复制已经成功配置。

  • 相关阅读:
    Java面试题——继承,多态
    智能油烟机 优化烹饪体验
    如何使用Go与MQTT进行通信
    架构之路15. 创业 - 厌倦
    ThreeJs的场景实现鼠标拖动旋转控制
    【JAVAEE框架】Mybatis项目起步讲解
    关于企业微信中开发第三方应用遇到的退出问题
    【JavaWeb从入门到实战】MySQL筑基&初探SQL
    【毕业设计】深度学习行人重识别系统 - person reid
    04 jenkins中使用各种变量(Powershell、cmd)
  • 原文地址:https://blog.csdn.net/weixin_42679286/article/details/132696784