MySQL -- 基于Docker搭建主从集群
目录结构12345678$ tree.├── master│ ├── data│ └── master.cnf└── slave ├── data └── slave.cnf master.cnf12345678[mysqld]pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysqlserver-id=1log-bin=master-bingtid_mode=onenforce_gtid_consistency=on slave.cnf1234567891011[mysqld]pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysqlserver-id=2log-bin=slave-binread-only=1relay_log=relay-binlog-sl...
MySQL -- 主从复制的基本原理
主从切换 在状态1,客户端的读写都是直接访问节点A,节点B是节点A的从库 只是将节点A的更新都同步过来,在节点B本地执行,保持一致 在状态1,虽然节点B没有被直接访问,但依然建议设置成readonly模式 运营类的查询语句会在从库上执行,设置成readonly模式能够防止一些误操作 防止切换逻辑有Bug,例如出现双写,造成主从不一致 可以通过readonly状态来判断节点的角色 在状态1,节点B设置为readonly模式,同样能与节点A保持同步更新 readonly设置对超级权限用户是无效的,而节点B中用于同步更新的线程,就拥有超级权限 主从同步在节点A执行update语句,然后同步到节点B 从库B与主库A之间维持一个长连接,主库A内部有一个专门用于服务于从库B长连接的线程 在从库B上执行CHANGE MASTER命令,设置主库A的信息 IP、PORT、USER、PASSWORD 从哪个位置(文件名 + 日志偏移量)开始请求binlog 在从库B上执行START SLAVE命令,这时从库B会启动两个线程:io_thread + sql_thread io_thread:负责...
MySQL -- 数据可靠性
binlog的写入机制 事务在执行过程中,先把日志写到binlog cache,事务提交时,再把binlog cache写到binlog file 一个事务的binlog是不能被拆开的,不论事务多大,也要确保一次性写入 系统会给每个线程分配一块内存binlog cache,由参数binlog_cache_size控制 如果超过了binlog_cache_size,需要暂存到磁盘 事务提交时,执行器把binlog cache里面的完整事务写入到binlog file,并清空binlog cache 12345678-- 2097152 Bytes = 2 MBmysql> SHOW VARIABLES LIKE '%binlog_cache_size%';+-----------------------+----------------------+| Variable_name | Value |+-----------------------+----------------------+| binlog_cache_siz...
Java核心 -- Exception + Error
继承关系 概念 Exception:程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相关处理 Checked Exception:源代码显式捕获处理,编译期检查,设计初衷为从异常情况中恢复 Unchecked Exception(RuntimeException):可以编码避免的逻辑错误,不会在编译期强制要求 Error:在正常情况下,不太可能出现,绝大部分的Error都会导致程序处于不可恢复的状态 ClassNotFoundException12345Thrown when an application tries to load in a class through its string name using: The forName method in class Class. The findSystemClass method in class ClassLoader. The loadClass method in class ClassLoader.but no definition for the class with the specified...
MySQL -- 短连接 + 慢查询
短连接 短连接模式:连接到数据库后,执行很少的SQL后就断开,下次需要的时候再重连 在业务高峰期,会出现连接数突然暴涨的情况 MySQL建立连接的成本非常昂贵 成本:TCP/IP三次握手 + 登录权限判断 + 获取连接的数据读写权限 max_connections max_connections:MySQL实例同时存在的连接数上限 当连接数超过max_connections,系统会拒绝接下来的连接请求,返回:Too many connections 当连接被拒绝,从业务角度来看是数据库不可用 如果机器负载较高,处理现有请求的时间会变长,每个连接保持的时间也会变长 如果再有新建连接的话,很容易触发max_connections的限制 max_connections的目的是保护MySQL的 如果把max_connections设置得过大,更多的连接就会进来,导致系统负载会进一步加大 大量的资源会耗费在权限验证等逻辑上,而已经拿到连接的线程会抢不到CPU资源去执行业务SQL 123456mysql> SHOW VARIABLES LIKE '%max_conn...
MySQL -- RR的行锁
本文环境12345678910111213mysql> SELECT VERSION();+-----------+| version() |+-----------+| 8.0.12 |+-----------+mysql> SHOW VARIABLES LIKE '%transaction_isolation%';+-----------------------+-----------------+| Variable_name | Value |+-----------------------+-----------------+| transaction_isolation | REPEATABLE-READ |+-----------------------+-----------------+ 加锁规则 基本原则 加锁的基本单位是Next-Key Lock 遍历过程中被访问到的对象才有可能被加锁 等值查询的优化 如果遍历的是唯一索引(聚簇索引)且能等值命中,Next-Key Lock会降级为Row Lock ...
MySQL -- 幻读
表初始化123456789CREATE TABLE `t` ( `id` INT(11) NOT NULL, `c` INT(11) DEFAULT NULL, `d` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;INSERT INTO t VALUES (0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25); 定义与问题定义 幻读:在同一个事务内,前后两次查询同一范围的时候,后一次查询看到了前一次查询没有看到的行 幻读专指_新插入的行_ 在RR隔离级别下,普通查询是快照读,是看不到其他事务插入的数据的 幻读仅在当前读时才会出现 解决思路只有行锁假设SELECT * FROM t WHERE d=5 FOR UPDATE;只会在id=5这一行上加X Lock,执行时序如下: 时刻 session A session B session C T1 BEGIN;SELECT * FROM t...
MySQL -- 问题排查
表初始化12345678910111213141516171819CREATE TABLE `t` ( `id` INT(11) NOT NULL, `c` INT(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLARE i INT; SET i=1; WHILE (i<=100000) DO INSERT INTO t VALUES (i,i); SET i=i+1; END WHILE;END;;DELIMITER ;CALL idata(); 查询长时间等待大概率是表t被锁住了,通过SHOW PROCESSLIST;查看语句处于什么状态 1SELECT * FROM t WHERE id=1; 等MDL执行时序 session A session B LOCK TABLE t WRITE; SELECT * FROM t WHERE id=1...
MySQL -- 索引上的函数
结论先行如果对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器会决定放弃走树搜索功能 条件字段函数操作交易日志表123456789CREATE TABLE `tradelog` ( `id` INT(11) NOT NULL, `tradeid` VARCHAR(32) DEFAULT NULL, `operator` INT(11) DEFAULT NULL, `t_modified` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `tradeid` (`tradeid`), KEY `t_modified` (`t_modified`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 123456789101112131415-- 94608000 = 3 * 365 * 24 * 3600-- t_modified : 2016-01-01 00:00:00 ~ 2019-01-01 00:00:00DELIMITER ;;CREATE ...
MySQL -- order by rand
单词表目的:随机选择3个单词 12345678910111213141516171819CREATE TABLE `words` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `word` VARCHAR(64) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;DELIMITER ;;CREATE PROCEDURE wdata()BEGIN DECLARE i INT; SET i=0; WHILE i<10000 DO INSERT INTO words(word) VALUES (CONCAT(CHAR(97+(i DIV 1000)), CHAR(97+(i % 1000 DIV 100)), CHAR(97+(i % 100 DIV 10)), CHAR(97+(i % 10)))); SET i=i+1; END WHILE;END;;DELIMITER ;CALL wdata(); 查询语句1SELECT word FROM words ORD...















