MySQL主从复制(基于binlog日志方式)
文章目录
一、什么是主从复制?
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。
主从复制的作用
1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3.读写分离,使数据库能支撑更大的并发。
- a.从服务器可以执行查询工作(就是我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
- b.从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
总结:
实时灾备,用于故障切换;
读写分离,提供查询服务;
备份,避免影响业务。
主从复制必要的条件:
主库开启binlog日志(设置log-bin参数)
主从server-id不同
从库服务器能连同主库
二、主从复制原理、存在问题和解决方法
2.1.主从复制原理
原理:实现整个主从复制,需要由slave服务器上的IO进程和Sql进程共同完成;要实现主从复制,首先必须打开Master端的binary log(bin-log)功能,因为整个MySQL 复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己本地(slave端)按照执行日志中所记录的顺序,全部操作一遍。
- 在主库上把有数据更改的(DDL DML DCL)sql语句都记录到二进制日志(Binary Log)中。
- 备库的I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
- 备库的SQL线程读取中继日志中的事件,将其重放到备库数据库之上。
master 负责写 -----A
slave relay-log -----B
I/o 负责通信读取binlog日志
SQL 负责写数据
步骤一:主库开启binlog日志,开启后主库的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
步骤五:还会创建一个SQL线程,从relay log里面读取内容,将更新内容写入到slave的db
2.2.主从复制存在的问题以及解决办法
- 问题
1.主库宕机之后,数据可能会丢失
2.从库只有一个sql Thread,主库写压力大,复制很可能延时 - 解决方法
解决数据丢失的问题:使用半同步复制的复制模型来解决
解决从库复制延时的问题:使用并行复制的方式来解决
2.3.主从复制的同步模型
- MySQL中的主从复制模式包括异步复制、同步复制和半同步复制。
- 异步复制(Asynchronous Replication)
主库将变更写入二进制日志(Binary Log)后就直接返回成功。不关心从库是否真正应用了变更。
主库和从库之间有延迟,可能会丢失数据。
性能好,主库无需等待从库。适合可以承受一定数据丢失的场景。- 同步复制(Synchronous Replication)
主库写入二进制日志后,需要等待从库回复已经成功应用了变更后,才返回成功。
主从间延迟很低,数据不会丢失。
主库性能会受到一定影响,需要等待从库的反馈。- 半同步复制(Semisynchronous Replication)
主库写入二进制日志后,等待至少一个从库回复接收到日志后再返回。
既保证了一定的数据安全性,也不会严重影响主库性能。
即使从库不回复,也会在超时后改为异步复制,保证主库不会永远阻塞。
总之,需要根据业务需求,平衡一致性、可用性和性能来选择合适的复制模式。
2.4.拓展—Mysql并行复制
- 并行复制的演进
MySQL最早的主备复制只有两个线程,IO 线程负责从主库接收 binlog 日志,并保存在本地的 relaylog 中,SQL线程负责解析和重放 relaylog 中的 event。当主库并行写入压力较大时,备库 IO 线程一般不会产生延迟,因为写 relaylog 是顺序写,但是 SQL线程重放的速度经常跟不上主库写入的速度,会造成主备延迟。如果延迟过大,relaylog 一直在备库堆积,还可能把磁盘占满。
在官方的5.6版本之前,MySQL只支持单线程复制,因此在主库并发高,TPS高时就会出现严重的主备延迟问题。从单线程复制到最新版本的多线程复制,中间的演化经历了好几个版本。
TPS是"Transactions Per Second"的缩写,表示每秒处理的事务数量。在数据库领域中,TPS是衡量数据库处理能力和性能的重要指标之一。它表示数据库系统每秒能够执行的事务操作的数量,包括读取和写入操作。较高的TPS值通常表示数据库具有更高的并发处理能力,可以处理更多的事务请求。
并行复制(Parallel Replication)指的是在一主多从的MySQL复制结构下,配置多个SQL线程去并发请求主库的二进制日志事件,实现从库并行重放日志来提高复制效率,缩短复制延迟。 - 并行复制的工作原理是:
主库将二进制日志打包成文件片段传输给从库
从库的多个I/O线程并行请求不同日志片段
从库根据文件名排序后写入relay log
多个SQL线程并行读取各自relay log位置并执行 - MySQL并行复制是指在MySQL数据库中,可以同时复制多个事务到不同的slave实例上,以提高复制过程的效率。实现并行复制需要满足以下几个条件:
主服务器(master)上的日志事件必须按照顺序进行复制,不能进行并行复制。
同一事务中的多个日志事件必须按照顺序进行复制,不能进行并行复制。
不同事务之间的日志事件可以进行并行复制到不同的slave实例上。 - 在MySQL 5.6版本之后,MySQL引入了并行复制的功能,可以通过设置相关参数来启用并行复制。下面是一个配置mysql并行复制的示例代码:
首先,需要在主服务器和从服务器上都开启并行复制功能:
在主服务器的my.cnf文件中添加以下配置:
server-id = 1
log-bin = mysql-bin
binlog-format = row
slave-parallel-workers = 2
在从服务器的my.cnf文件中添加以下配置:
server-id = 2
relay-log = mysql-relay-bin
binlog-format = row
slave-parallel-workers = 2
然后,在从服务器上设置复制主服务器的相关信息:
mysql> CHANGE MASTER TO
MASTER_HOST='master-server',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=12345;
通过以上配置,可以使得从服务器上的复制进程可以并行复制来自主服务器的事务日志,提高数据复制的效率。
三、主从复制之基于binlog日志方式
3.1.bin-log日志简介
- Binlog是MySQL数据库中的二进制日志,用于记录数据库中所有修改操作,包括增删改等操作。binlog以二进制格式保存,可以通过解析binlog文件来查看数据库的操作历史记录。binlog日志可以用于数据恢复、数据备份、数据同步等场景。
- 在MySQL数据库中,binlog有三种模式:statement模式、mixed模式和row模式。statement模式记录的是SQL语句,row模式记录的是每一行数据的变化;mixed模式是自动组合 STATEMENT 和 ROW 模式,按照最优方式来记录日志。Binlog日志的开启和关闭可以通过设置MySQL的配置文件实现。
- Binlog的作用非常重要,它可以用来进行数据恢复和备份,也可以用来进行数据同步和复制。在进行数据恢复时,可以使用Binlog来恢复数据到某个时间点或某个操作之前的状态,从而保证数据的完整性。在进行数据备份时,可以将Binlog文件备份到另一台服务器上,以便在主服务器出现问题时,可以快速地将备份服务器恢复到与主服务器相同的状态。
- 除了数据恢复和备份外,Binlog还可以用来进行数据同步和复制。在进行数据同步时,可以将Binlog文件传输到其他服务器上,从而将数据同步到其他服务器中。在进行数据复制时,可以将Binlog文件传输到备份服务器上,从而将备份服务器上的数据与主服务器上的数据保持一致。
3.2.bin-log的使用
3.2.1.开启binlog
首先查看mysql是否开启binlog同步功能
mysql> show variables like 'log_bin';
默认是关闭的,此时需要开启,就要编辑mysql的配置文件,正常是在etc目录下
如果没有就先用 which mysqld查看位置
修改my.cnf配置
[root@localhost ~]# vim /etc/my.cnf
//[mysqld]开启binlog
log-bin = mysql-bin
也可以通过SET SQL_LOG_BIN=1
命令来启用 binlog,通过SET SQL_LOG_BIN=0
命令停用 binlog。
不过启用 binlog 之后须重启MySQL才能生效
3.2.2.常用的binlog命令
是否启用binlog日志show variables like 'log_bin';
查看详细的binlog日志配置信息show global variables like '%log%';
查看binlog的目录show global variables like "%log_bin%";
查看binlog文件日志列表show binary logs;
查看最新一个binlog日志文件名称和Position(操作事件pos结束点)show master status;
刷新log日志,自此刻开始产生一个新编号的binlog日志文件
每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F选项也会刷新binlog日志;flush logs;
查看第一个binlog文件内容show binlog events
查看具体一个binlog文件的内容show binlog events in 'master.000001';
重置(清空)所有binlog日志reset master;
删除slave的中继日志reset slave;
删除指定日期前的日志索引中binlog日志文件purge master logs before '2022-02-22 00:00:00';
删除指定日志文件purge master logs to 'master.000001';
3.2.3.使用binlog
1.使用mysqlbinlog自带查看命令法:
注: binlog是二进制文件,普通文件查看器cat more vi等都无法打开,必须使用自带的 mysqlbinlog 命令查看,binlog日志在同目录的data下
比如我刚刚建了一个表
mysql> CREATE TABLE IF NOT EXISTS `fungmu_table`( `id` INT UNSIGNED AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL, `age` VARCHAR(40) NOT NULL, `create_date` DATE,
PRIMARY KEY ( `id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后使用以下命令查看二进制日志
[root@localhost ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000001
2.mysql命令行
直接查看binlog日志的话全文内容较多,不容易分辨查看pos点信息,这时候可以使用mysql命令行
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
IN ‘log_name’ 指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos 指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] 偏移量(不指定就是0)
row_count 查询总条数(不指定就是所有行)
例如:
Log_name: mysql-bin.000001
pos起始点:Pos: 11197
事件类型:QueryEvent_type: Query
3.3.bin-log日志类型详解
记录在二进制日志中的事件的格式取决于二进制记录格式。支持三种格式类型:
- STATEMENT:基于SQL语句的复制(statement-based replication, SBR)
- ROW:基于行的复制(row-based replication, RBR)
- MIXED:混合模式复制(mixed-based replication, MBR)
在 MySQL 5.7.7 之前,默认的格式是 STATEMENT,在 MySQL 5.7.7 及更高版本中,默认值是 ROW。日志格式通过 binlog-format 指定,如
binlog-format=STATEMENT、binlog-format=ROW、binlog-format=MIXED
3.3.1.Statement格式类型
- MySOL5.1之前的版本都采用这种方式,顾名思义,日志中记录的都是sql语句(statement),每一条对数据造成修改的SOL 语句都会记录在日志中,通过mysqlbinlog工具、可以清晰地看到每条语句的文本。每一条会修改数据的sql都会记录在binlog中
- 主从复制的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。
- 优点是不需要记录每一行的变化,减少了binlog日志量,节约了IO, 提高了性能。
- 缺点是在某些情况下slave 的日志复制会出错。因为Statement 模式只记录 SQL,而如果一些 SQL 中 包含了函数,那么可能会出现执行结果不一致的情况。比如说 uuid() 函数,每次执行的时候都会生成一个随机字符串,在 master 中记录了 uuid,当同步到 slave 之后,再次执行,就得到另外一个结果了。
3.3.2.Row格式类型
- 5.1.5版本的MySQL才开始支持 row level 的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。
- 它将每一行的变更记录到日志中,而不是SOL语句。比加一个简单的更新 SOL: update emp set name=‘abc’,如果是STATENENT格式,日志中会记录一行SQL文本;
- 但是如果是ROW,由于是对全表进行更新,也就是每一行记录都会发生变更,如果是一个100 万行的大表,则日志中会记录 100 万条记录的变化情况。日志量大大增加。这种格式的优点是会记录每一行数据的变化细节,不会出现某些情况下无法复制的问题。
- 优点是binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以row的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。
- 缺点是日志量太大了,特别是批量 update、整表 delete、alter 表等操作,由于要记录每一行数据的变化,此时会产生大量的日志,大量的日志也会带来 IO 性能问题。
3.3.3.Mixed格式类型
- 从 MySQL5.1.8 版开始,MySQL 又推出了 Mixed 格式,这种格式实际上就是 Statement 与 Row 的结合。
- 在 Mixed 模式下,系统会自动判断 该 用 Statement 还是 Row:一般的语句修改使用 Statement 格式保存 binlog;对于一些 Statement 无法准确完成主从复制的操作,则采用 Row 格式保存 binlog。
- Mixed 模式中,MySQL 会根据执行的每一条具体的 SQL 语句来区别对待记录的日志格式,也就是在 Statement 和 Row 之间选择一种。
3.3.4.如何选用bin-log的格式类型
关于这三中格式的binlog,我们在使用的时候到底应该使用哪一种?
- 如果我们的磁盘空间和服务器性能比较OK的情况下,尽量使用Row模式,因为这种模式能够最大程度的保证安全性,虽然产生的日志量很多,但是当你误删数据的时候,你就会感受到binlog给你带来的温暖。
- 当我们对一些不太重要的业务库(例如一些log库)进行数据主从复制的时候,尽量使用statement来执行,因为它的速度快,日志量小,而且不牵扯使用函数,是简单的数据同步。
- 如果有一些场景需要尽量保证性能,但是又没有十分严格的要求时,我们可以设置为Mixed格式,它可以在statement和Row之间进行切换,保证了业务的写入性能。
- 最后一点,在RC和RU隔离界别下,不能使用statement格式的binlog日志。
说明:RC 和 RU 是指 MySQL 的事务隔离级别
- RC:可重复读(Repeatable Read)
- RU:可串行化(Serializable)
- 在这两个隔离级别下,使用 STATEMENT 格式会出现问题,比如导致主从数据不一致。
- 因为 RC 和 RU 下的事务存在各种间隙锁、Next-Key Lock等机制,这会导致同一事务的后续语句看到的是之前语句修改过的数据版本。但这种读已修改数据的语句无法在 STATEMENT 模式下正确复制。
- 所以建议在 RC 和 RU 隔离级别下使用 ROW 格式,以确保完全正确地复制主从数据。
3.3.5.bin-log的常用场景
1、mysql主从复制
2、mysql数据备份和恢复
3、数据同步,比如基于Canal投递MySQL Binlog到kafka、elasticsearch
3.3.6.bin-log和redo-log
binlog 和 redolog,这两者有什么区别呢?
- binlog是MySQL Server层的日志,而redolog是MySQL引擎InnoDB层的日志
- 另外一个不同是两者写入时机不同,redolog是prepare阶段每执行sql语句就写redo了,而binlog是在prepare完commit前写的。
作用范围不同:
- binlog 记录所有修改数据的 SQL 语句,用于主从复制。
- redo log 只记录对 InnoDB 引擎表的修改,用于崩溃恢复。
日志内容不同:
- binlog 包含可重播的 SQL 语句或行更改信息。
- redo log 包含对页面和行的物理修改信息。
日志格式不同:
- binlog 是二进制格式,人工不可读。
- redo log 是明文记录,人工可读。
日志大小不同:
- binlog 会非常大,特别是行格式。
- redo log 的大小有限制,通常较小。
存储位置不同:
- binlog 存储在磁盘上。
- redo log 存储在内存中,偶尔刷新到磁盘。
日志管理不同:
- binlog 需要人工定期清理过期日志。
- redo log 通过循环使用空间,无需人工管理。
3.4.基于binlog的主从复制实战操作
3.4.1.准备环境
1、准备环境两台机器,关闭防火墙和selinux;两台机器环境必须一致。时间也得一致
192.168.221.136 mysql-master
192.168.221.138 mysql-slave
2、两台机器安装mysql5.7(略)建议使用相同的安装方式
注意:
对主库已有的数据库不会进行自动同步。
主从同步之前,主库上已有数据库备份,需要在从库上手动导入同步。
3.4.2.配置master主服务
在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID(server-id);修改配置文件后,需要重启mysql。
编辑主服务器的配置文件 my.cnf,添加如下内容
[root@mysql-master ~]# vim /etc/my.cnf //添加配置
[mysqld]
log-bin=/usr/local/mysql/logs/mysql-bin/mylog
server-id=1
创建日志目录并赋予权限
[root@mysql-master ~]# mkdir /usr/local/mysql/logs/mysql-bin/mylog -p
[root@mysql-master ~]# chown -R mysql:mysql /usr/local/mysql/
重启服务
[root@mysql-master ~]# systemctl restart mysqld
3.4.3.在主服务器上查看binlog以及POS点
mysql> show master status\G
*************************** 1. row ***************************
File: mylog.000001
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#记录下
File: mylog.000001
Position:154 Position:位置
3.4.4.创建主从同步的用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'JiannLt@123';
mysql> flush privileges;
3.4.5.从服务配置slave
my.cnf配置文件,注意server-id不能相同
[root@mysql-slave ~]# vim /etc/my.cnf
[mysqld]
server-id=2
//修改完配置文件重启mysql服务
[root@mysql-slave ~]# systemctl restart mysqld.service
3.4.6.从库配置
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.221.136',
MASTER_USER='repl',
MASTER_PASSWORD='JiannLt@123',
MASTER_LOG_FILE='mylog.000001',
MASTER_LOG_POS=154;
#参数解释:
MASTER_HOST='master2.example.com', #主服务器ip
MASTER_USER='replication', #主服务器用户
MASTER_PASSWORD='password', #用户密码
MASTER_PORT=3306, #端口
MASTER_LOG_FILE='master2-bin.001', #binlog日志文件名称
MASTER_LOG_POS=4, #日志位置
mysql> start slave;
mysql> show slave status\G
#查看状态,验证sql和IO是不是yes。
说明成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.4.7.数据同步测试
#主库新建数据库,从库检查同步情况
#主库新建库
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)
#从库查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
3.4.8.故障切换
mysql主从,master宕机,如何进行切换?
主机故障或者宕机:
1.在salve执行:
mysql> stop slave;
mysql> reset master;
2.查看是否只读模式:
mysql> show variables like 'read_only';
只读模式需要修改my.cnf文件,注释read-only=1并重启mysql服务。
或者不重启使用命令临时关闭只读,但下次重启后失效:set global read_only=off;
3.查看
mysql> show slave status \G;
4.在程序中将原来主库IP地址改为现在的从库IP地址,测试应用连接是否正常
3.4.9.故障排错
UUID一致,导致主从复制I/O线程不是yes
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work
致命错误:由于master和slave具有相同的mysql服务器uuid,导致I/O线程不进行;这些uuid必须不同才能使复制工作。
问题提示主从使用了相同的server UUID,一个个的检查:
检查主从server_id
检查主从状态:
#主库:
mysql> show master status
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#从库:
mysql> show slave status
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 306 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#File一样,排除。
最后检查发现他们的auto.cnf中的server-uuid是一样的。
[root@localhost ~]# vim /usr/local/mysql/data/auto.cnf
[auto]
server-uuid=4f37a731-9b79-11e8-8013-000c29f0700f
//修改uuid并重启服务
3.4.10.重设从库
#主库查看binlog,pos
mysql> show master status \G;
*************************** 1. row ***************************
File: mylog.000003
Position: 348
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
#从库上操作
mysql> stop slave;
mysql> reset slave;
mysql> reset master;
#从库的binlog已经无效了,所以要执行这个命令清空binlog
CHANGE MASTER TO
MASTER_HOST='192.168.221.136',
MASTER_USER='slave',
MASTER_PASSWORD='JiannLt@123',
MASTER_LOG_FILE='mylog.000003',
MASTER_LOG_POS=348;
mysql> start slave;
mysql> show slave status\G
如果在没有故障的情况下进行从库的重设操作,那么进行change master后,会发现SQL线程不正常为NO
解决办法:(就是搞点错误出来测试)
将前面同步的库删掉,再执行上面的操作:stop slave/reset slave/reset master/change master……
建议:非故障的情况下不要随意重设从库操作
相关文章:

【Mongdb之数据同步篇】什么是Oplog、Mongodb 开启oplog,java监听oplog并写入关系型数据库、Mongodb动态切换数据源
oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。Oplog 可以说是Mongodb Replication的纽带了。

Windows下安装和配置Redis
下载版本Redis-x64-5.0.14.1.zip。(可能需要开代理)

MySQL慢查询日志slowlog
慢速查询日志记录的是执行时间超过秒和检查的行数超过的SQL语句,这些语句通常是需要进行优化的。官方参考文档:https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html。

一文搞懂MySQL索引
官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。看到这里,你是不是对于自己的sql语句里面的索引的有了更多优化想法呢。

ON DUPLICATE KEY UPDATE 导致mysql自增主键ID跳跃增长
具体解决方案可以根据项目来选择,如果项目不大,可以考虑1和2。如果不考虑高并发问题,可以考虑3。

mysql唯一索引与null
根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的,在oracel也是如此。在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。有上面的表和数据可以看出,查询多条数据。

详解mybatis的insert,update,delete返回值
为什么要提数据的事呢,是因为据说这个save返回的就是插入的数据的条数。但是遗憾的是,我们的这个user怎么能没有id呢,没有id有怎么查,怎么删,怎么改。进来的是没有id的user,出去的是有id的user,真是太厉害了,没想到不仅把返回值改变了,连参数都发生了改变,真是太神奇了。keyProperty=“id” 这是id就是绑定的id,那我就疑惑了,这绑定的哪个id啊。这样一搞,如果插入成功的话返回的是1,如果不成功的话返回的是-1。我让你删id是222222的,我还没创建呢,看你怎么删。

MYSQL 主从复制 --- binlog
在 Master 端并不 Care 有多少个 Slave 连上了自己,只要有 Slave 的 IO 线程通过了连接认证,向他请求指定位置之后的 Binary Log 信息,他就会按照该 IO 线程的要求,读取自己的 Binary Log 信息,返回给 Slave 的 IO 线程。默认MySQL是未开启该日志的。如果读压力加大,就需要更多的 slave 来解决,但是如果slave的复制全部从 master 复制,势必会加大 master 的复制IO的压力,所以就出现了级联复制,减轻 master 压力。

MySQL 中 is null 和 =null 的区别
如果 set ANSI_NULLS为 ON 时,表示SQL语句遵循SQL-92标准;如果 set ANSI_NULLS 为 OFF 时,表示不遵从 SQL-92 标准。但SQL-92 标准要求对null的 = 或不等于 (!= ,) 比较取值都为 false,也就是 =null 或者 null,返回的都是false。null 在MySQL中不代表任何值,通过运算符是得不到任何结果的,因此只能用 is null(默认情况)MySQL 中 null 不代表任务实际的值,类似于一个未知数。

CSS局限属性contain:优化渲染性能的利器
在网页开发中,优化渲染性能是一个重要的目标。CSS局限属性contain是一个强大的工具,可以帮助我们提高网页的渲染性能。本文将介绍contain属性的基本概念、用法和优势,以及如何使用它来优化网页的渲染过程。

配置nginx+keepalived高可用代理数据库ip端口
需求:配置nginx+keepalived高可用反向代理数据库ip端口(数据库服务器无法增加新SCAN IP或者需要隐藏数据库IP的情况下适用)本机ip为:192.168.20.10和192.168.20.11。2.任意节点关机或重启系统,浮动ip也会自动漂移到另外节点。1.任意节点停nginx:浮动ip会自动漂移到另外节点。安装依赖包和nginx和keepalived。浮动IP为:192.168.20.20。配置keepalived.conf。两台centos7.9。

Redis 击穿、穿透、雪崩产生原因解决思路
也就是在设定的时间里数据没有取出来,但是锁由过期了,常见的思路是,锁过期时间值递增,但是想想不靠谱,因为第一个请求可能超时,如果后面的也超时呢,接连多次超时之后,锁过期时间值势必特别大了,这样做弊端太多。雪崩,和击穿类似,不同的是击穿是一个热点Key某时刻失效,而雪崩是大量的热点Key在一瞬间失效,网络上很多博客都在强调解决雪崩的策略是随机过期时间,这个非常不准确,举个例子,银行做活动,之前这个利息系数为2%,过了零点系数改为3%,这种情况能将用户的对应的key改为随机过期吗?如果用的过去的数据叫脏数据。

MySQL数据库查询语句之组函数,子查询语句
当一个SQL的执行需要借助另一个SQL的执行结果时,则需要进行SQL嵌套,该语法结构称之为子查询。先筛选出符合要求的数据,再对符合要求的数据进行分组时,分组的工作量会被减少,效率更高。先确定从哪张表进行操作-->对表中数据进行分组-->基于分组结果进行查询操作。执行顺序:优先执行小括号内的子SQL,根据子SQL的执行结果再执行外层SQL。执行顺序:from-->where-->group by-->select。执行顺序:from-->group by-->select。

mysql开启可以使用IP有权限访问
为实际的IP地址和你想要设置的密码。请小心操作,并确保你了解每个命令的作用。如果你对此有任何疑问,最好咨询经验丰富的数据库管理员。来设置或修改用户的密码。相反,你需要分两步来完成这个过程:首先创建或修改用户,并设置密码;然后授予相应的权限。用户应该能够从指定的内网IP地址访问MySQL服务器。用户已存在并且你只是想更改其密码或允许从另一个地址访问,使用。在MySQL 8.0及更高版本中,语句的语法有所变化。替换为你的内网IP地址,

鸿蒙harmony--数据库sqlite详解
今天是1月20号星期六,早安,岁末大寒至,静后春归来。愿他乡故人,漂泊有归宿,前程有奔赴,愿人间不寒,温暖常伴,诸事顺利,喜乐长安。

Redis的key过期策略是怎么实现的
这是一道经典的Redis面试题,一个Redis中可能存在很多很多的key,这些key中可能有很大一部分都有过期时间,此时Redis服务器咋知道哪些key已经过期,哪些还没过期呢?如果直接遍历所有的key,这显然是行不通的,效率非常低!!Redis整体的策略是定期删除和惰性删除相结合。举个栗子:假如我去小卖铺买东西,付款的时候,发现东西过期了。就告知老板,于是老板下架此产品。消费者发现过期了,才去下架,这就叫。小卖铺老板主动定期抽取一部分商品,进行筛查,这就叫定期删除。

雪花算法生成ID、UUID生成ID和MySql自增ID优缺点分析
综上所述,UUID适用于分布式系统和需要保密的场景,雪花ID适用于分布式系统和高并发环境,MySQL自增ID适用于单机系统和高效查询的场景。根据具体的业务需求和系统架构,选择合适的主键类型。通过本文的介绍和对比,希望读者能够更好地理解在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并能够根据实际情况做出明智的选择。在MySQL中,使用自增整数作为主键是一种常见的做法,因为它具有较小的存储空间、高效的索引和自动增长的特性。然而,具体选择何种主键类型还是要根据具体的业务需求和数据特点来决定。

【小白专用】C# 连接 MySQL 数据库
C# 连接 MySQL 数据库

如何用pthon连接mysql和mongodb数据库【极简版】
发现宝藏 前言 1. 连接mysql 1.1 安装 PyMySQL 1.2 导入 PyMySQL 1.3 建立连接 1.4 创建游标对象 1.5 执行查询 1.6 关闭连接 1.7 完整示例 2. 连接mongodb 2.1 安装 PyMongo 2.2 导入 PyMongo 2.3 建立连接 2.4

Springboot支付宝沙箱支付---完整详细步骤
两种方式进行配置。这里我采取的是默认方式: 开发者如需使用系统默认密钥/证书,可在开发信息中选择系统默认密钥。注意:使用API在线调试工具调试OpenAPI必须使用系统默认密钥。

MySQL索引优化实战
对于这种varchar(255)的大字段可能会比较占用磁盘空间,可以稍微优化下,比如针对这个字段的前20个 字符建立索引,就是说,对这个字段里的每个值的前20个字符放在索引树里,类似于 KEY index(name(20),age,position)。此时你在where条件里搜索的时候,如果是根据name字段来搜索,那么此时就会先到索引树里根据name 字段的前20个字符去搜索,定位到之后前20个字符的前缀匹配的部分数据之后,再回到聚簇索引提取出来 完整的name字段值进行比对。

Linux安装MongoDB教程
将解压后的 mongodb-linux-x86_64-rhel70-4.2.23 中的所有文件全部移动到 /usr/local/mongodb 中 :注意/*是所有子文件。也可以不用设置环境变量进行启动,但是不设置环境变量启动的话要每次启动写很多启动参数,比较麻烦,所以做好配置环境变量。在 mongodb 下创建 data 和 logs 目录,以及日志文件mongodb.log。在 /usr/local 目录中创建 mongodb 文件夹。启动 MongoDB(-conf 使用配置文件方式启动)

《mybatis》--大数据量查询解决方案
之前写百万以及千万的导出数据的时候,对于将数据写道csv文件并压缩这里没有什么大问题了,但是出现了其他问题为:1、我们需要将数据从数据库中拿出来,并且在进行装配的时候出现了一些问题。2、对于整体内存安全来说,如果直接将数据从数据库中拿出来百万级别以上的数据对于内存是非常不友好的。当问题出现比较大的时候会直接触发GC,造成瘫痪。目前开发以及项目测试的是更多的使用mybatis来进行开发的,所以本文章讨论以及解决的的就是如何使用mybaits来解决流式查询并单条处理的问题。

什么是HBase?终于有人讲明白了
在 HBase 表中,一条数据拥有一个全局唯一的键(RowKey)和任意数量的列(Column),一列或多列组成一个列族(Column Family),同一个列族中列的数据在物理上都存储在同一个 HFile 中,这样基于列存储的数据结构有利于数据缓存和查询。HBase Client 为用户提供了访问 HBase 的接口,可以通过元数据表来定位到目标数据的 RegionServer,另外 HBase Client 还维护了对应的 cache 来加速 Hbase 的访问,比如缓存元数据的信息。

Spring中事务控制的API介绍(PlatformTransactionManager和TransactionDefinition)
事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。属性,同时,Spring 还为我们提供了一个默认的实现类:DefaultTransactionDefinition,该类适用于大多数情况。作用:是一个事务管理器,负责开启、提交或回滚事务。

ClickHouse 与mysql等关系型数据库对比
先用一张图帮助理解两者的本质上的区。

Redis 除了用作缓存还能干吗?
Redis 是一种内存键值数据库。它支持多种数据结构,如 String, Hash, List, Set 和 SortedSet。

Windows安装MySQL及网络配置
向日葵软件是一种远程控制软件,可以让用户在不同设备之间进行远程桌面访问和文件传输。用户可以通过向日葵软件,在任何具有互联网连接的设备上远程控制其他设备,包括计算机、智能手机和平板电脑。用户只需安装向日葵软件,并使用登录凭据连接到目标设备,就可以实时控制目标设备上的屏幕、键盘和鼠标。向日葵软件还提供了一些辅助功能,如文件传输、远程打印和远程会议等。这使得向日葵软件成为一个方便实用的远程协助工具,适用于个人用户、技术支持人员和企业用户等各种场景。

Web数据库基本知识,SQL基本语法
SQL(Structured Query Language)是一种用于管理和操作关系型数据库管理系统(RDBMS)的特定领域语言。它是一种标准化的语言,用于定义和操作关系型数据库中的数据。SQL允许用户执行诸如查询数据、插入新数据、更新现有数据和删除数据等操作。分为四种DDL:数据库定义语言(define)DML:数据库操作管理语言(manage)DQL:数据库查询语言(query)DCL:数据库控制语言(control)

分库分表解决方案-ShardingSphere-JDBC
ShardingSphere-JDBC 是一个工作在客户端的,定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。