MySQL8.0支持在一个复制通道上配置多个可用复制源,当某个复制源不可用时,自动根据权重重新选择数据源进行同步。例如我们本地有一个跨机房的MGR高可用环境,计划在另一个地区的机房搭建一个异步复制节点做容灾。当MGR主节点发生切换时,就可以通过该特性在新主节点继续进行复制。
MySQL8.0 : caching_sha2_password认证
在MySQL8.0中,用户认证插件默认值为caching_sha2_password,可以实现SHA-256加密认证。
1 | msandbox@(none) 15:39: show variables like 'default_authentication_plugin'; |
MySQL8.0 : 窗口函数
测试数据
1 | root@test 03:53: select * from t1; |
MySQL主从数据不一致修复
percona-toolkit : pt-stalk
pt-stalk采用shell脚本编写,主要用于在问题时间点收集OS及MySQL的诊断信息,包括CPU,内存,磁盘等资源以及数据库锁等待,主从复制,状态等信息。
触发
pt-stalk可以用后台服务的方式监控MySQL并指定触发条件,当触发条件时收集相关当前时间点系统和数据库信息。相关参数如下:
AlwaysOn可用性组创建失败(error 41131)
问题描述
在SQLServer2016上创建可用性组失败,错误显示如下:
1 | Failed to bring availability group 'availability_group' online. The operation timed out. |
Percona Backup For MongoDB
概述
早前,在Percona for MongoDB上手一文中提到Percona版本的MongoDB支持热备份,现在Percona已经将该功能独立出来,让你可以在社区版的MongoDB replset或集群上进行备份,支持MongoDB3.6或更高版本。
Anemometer慢日志展示
Anemometer 是一个MySQL慢日志展示的工具,结合pt-query-digest,输出较为详细的MySQL慢查询信息,有助于性能优化分析。Anemometer为B/S架构,WEB端依赖于LAMP,因此我们需要安装配置MySQL、PHP、Apache,其数据来源于pt-query-digest,因此我们还需要安装percona-toolkit。
Centos7.2查看目录使用率hang住
现象:
Centos7.2通过df -h查看目录使用率卡住,无法结束
分析:
通过strace命令跟踪df命令,发现在stat(“/proc/sys/fs/binfmt_misc处卡住,查看unit状态
1 | $ systemctl list-units -all | grep binfmt |
MySQL分区表
PMM监控-数据库监控
PMM监控:安装配置
PMM是由Percona开源的,用于管理和监视MySQL和MongoDB性能,是一个不错的性能监控工具。PMM主要由client和server构成,client部署在每个监控主机上,收集服务器指标、常规系统指标和查询分析数据;server用于聚合收集的数据,在web中以图表形式进行展现。
MySQL复制:slave_rows_search_algorithms参数
在基于ROW模式复制的环境下,slave_rows_search_algorithms参数控制如何在行中搜索匹配项,特别是是否使用Hash Scan,设置后会立即对所有复制通道生效。其值可设置为INDEX_SCAN、TABLE_SCAN、HASH_SCAN中指定两个值,以逗号分隔,参数默认值为INDEX_SCAN,TABLE_SCAN
。常见的推荐组合及其效果如下:
MySQL Shell Dump/Load
在MySQL Shell8.0.17中引入了一个多线程CSV导入工具:util.importTable()。在使用之前需要先开启local_infile参数,下面就是一个简单的示例
1 | util.importTable("/tmp/productrange.csv", {schema: "mydb", table: "products", dialect: "csv-unix", skipRows: 1, showProgress: true}) |
优化MySQL内存管理:tcmalloc
MySQL8.0新特性:直方图
查询优化器负责将SQL查询转换为尽可能高效的执行计划,但随着数据环境不断变化,查询优化器可能无法找到最佳的执行计划,导致SQL效率低下。造成这种情况的原因是优化器对查询的数据了解的不够充足,例如:每个表有多少行数据,每列中有多少不同的值,每列的数据分布情况。
Otter异地双中心部署
MySQL8.0新特性:索引新特性
函数索引
在MySQL8.0之前对条件字段做函数操作、或者做运算都将不会使用字段上的索引,例如下面的例子
1 | root@employees 14:09: show index from employees; |
Git学习
安装Git
下载Git
解压Git
1 | [root@t-luhx01-v-szzb ~]# tar -xvf git-2.3.0.tar.gz |
编译安装Git
1 | [root@t-luhx01-v-szzb ~]# cd git-2.3.0 |
Oracle SCAN-IP
SCAN(Single Client Access Name)是Oracle从11g R2开始引入的,客户端可以通过SCAN特性负载均衡地连接到RAC群集。SCAN是一个域名,可以解析至少1个IP,至多3个IP,SCAN IP需要与public IP在一个子网内。SCAN域名可以通过DNS或GNS的方式来解析,GNS是11GR2引入的,可以通过DHCP服务为节点和SCAN分配VIP和SCAN IP,当然也可以采用HOST解析的方式来配置SCAN,这种方式就只能定义一个SCAN IP。
Oracle HeartBeat
心跳(HeartBeat)最主要的目的就是为了检测群集中的节点状态,如果节点状态检测异常,则认为节点存在故障,需要对该节点做出相应的处理。在Oracle RAC中有三种心跳机制:
- 网络心跳(Network Hearbeat):OCSSD进程会每秒向集群其它节点发送一个TCP网络心跳包,如果一个节点在15秒内都接收不到来自其它节点的心跳包,会在OCSSD日志中记录WARNING,直到30秒都无法接收,则认为心跳丢失,该节点会被踢出群集。可以通过crsctl get css misscount查看网络心跳
1
2[root@t-luhxdb1-v-szzb ~]# crsctl get css misscount;
CRS-4678: Successful get misscount 30 for Cluster Synchronization Services. - 磁盘心跳(Disk HeartBeat):群集中每个节点的OCSSD进程会每秒在voting disk上注册本节点的磁盘心跳信息,同时也会监控群集中其它节点OCSSD进程维护的磁盘心跳。当群集发生脑裂,通过voting disk仲裁哪个节点获得控制权,其它的节点被剔除,之后根据reboottime参数的设置重启失败的节点。可以通过crsctl get css disktimeout查看磁盘心跳
1
2
3
4
5[root@t-luhxdb1-v-szzb ~]# crsctl get css disktimeout;
CRS-4678: Successful get disktimeout 200 for Cluster Synchronization Services.
[root@t-luhxdb1-v-szzb ~]# crsctl get css reboottime
CRS-4678: Successful get reboottime 3 for Cluster Synchronization Services - 本地心跳(Local HeartBeat):Oracle 11GR2中引入了本地心跳,本地心跳最主要的作用是监控OCSSD进程以及本地节点的状态。在10G中是通过oclsomon和oprocd实现,守护进程oclsomon.bin监控ocssd.bin进程的状态,oprocd.bin进程监控本节点状态。从11GR2开始引入了cssdagent和cssdmonitor,它们的功能就是监控本地节点的ocssd.bin进程状态和本地节点的状态。
PostgreSQL数据类型
数值类型
数值类型由两字节、四字节、八字节整数、四字节和八字节浮点数以及可选精度小数组成。下表列出了可用的类型
类型 | 字节数 | 范围 |
---|---|---|
smallint | 2bytes | -32768 to +32767 |
integer | 4bytes | -2147483648 to +2147483647 |
bigint | 8bytes | -9223372036854775808 to 9223372036854775807 |
decimal | 可变 | 小数点前131072位;小数点后的16383位 |
numeric | 可变 | 小数点前131072位;小数点后的16383位 |
real | 4bytes | 6位小数精度 |
double precision | 8bytes | 15位小数精度 |
smallserial | 2bytes | 1 to 32767 |
serial | 4bytes | 1 to 2147483647 |
bigserial | 8bytes | 1 to 9223372036854775807 |
PostgreSQL安装部署
操作系统配置
安装依赖包
1 | yum -y install coreutils glib2 lrzsz dstat sysstat e4fsprogs xfsprogs \ |
MySQL8.0新特性:Instant Add Column
在MySQL5.7中,Innodb通过重新生成表(即使采用INPLACE DDL算法)向表添加列,其会存在以下问题:
- 对于大表,可能重建时间会很长
- 由于过程中会产生临时表,会占用磁盘空间
- DDL占用较多资源
- 对于复制,将会造成较大的同步延迟
MongoDB副本集

为了解决MongoDB单点故障问题,推出了副本集复制功能,其中主节点用于处理客户端读写请求,从节点用于复制主节点的数据,当主节点故障时,副本集自动切换提升一个成员作为新的主节点继续提供服务。
MySQL8.0新特性:Clone Plugin
MySQL8.0.17推出了Clone plugin功能,其允许用户对当前示例进行本地或远程克隆,对快速搭建复制环境,备份等场景非常有用。
- 本地克隆:将数据从当前MySQL Server克隆到当前主机上的一个指定目录下面
- 远程克隆:启动克隆的MySQL Server称之为recipient(接收者),远程数据源的MySQL Server称之为donor(提供者),在recipient上执行远程克隆,数据会通过网络传输到recipient。克隆过程中会覆盖清除recipient上的所有数据,如果不希望被覆盖需指定克隆数据放在其它目录
- clone plugin支持在复制拓扑中使用。除了克隆数据外,克隆还会携带复制信息(binlog位置),并将其应用于接收方。我们可以用于在组复制中添加成员,也可以在主从环境中添加新的从节点。当组成员和待加入组的Server都支持Clone plugin,待加入的组成员可以自行选择一个更高效的方式获取数据。
- 克隆插件支持克隆数据加密的和数据页压缩
Haproxy配置详解
Keepalived配置详解
Powershell:遍历文件夹大小
1 | function filesize ([string]$filepath) |
MySQL8.0新特性:备份优化
MySQL8.0新特性:角色权限
MySQL5.7
在5.7中想要实现角色功能的话可以借助proxies_priv来简单实现,要想使用proxies_priv需要先开启相关参数
1 | root@(none) 17:28: set global check_proxy_users =on; |
MySQL8.0新特性:Replset
安装插件
1 | root@(none) 15:32: INSTALL PLUGIN Rewriter SONAME 'rewriter.so'; |
MySQL唯一索引范围锁bug修复
在MySQL8.0.18之前,针对唯一索引或主键索引进行范围条件加锁时,向右遍历过程中,会一直扫描并加next-key锁到第一个不满足条件的记录为止,然后退化为间隙锁,但RR隔离级别下并不会退化,也就是锁的范围扩大了,严格来说这算是一个bug,这一问题直到8.0.18总算被优化了。
INPLACE upgrade from MySQL 5.7 to MySQL 8.0
升级检查
mysqlcheck
1 | [root@centos7-4 service]# mysqlcheck -uroot -p --all-databases --check-upgrade |
wait_resource详解
当我们通过下列SQL查询数据库当前正在执行的SQL时,我们会发现wait_resource时常会出现等待,今天就来对常见的等待对象类型进行介绍
1 | SELECT |
索引碎片维护
在SQL Server中,存储数据最小的单位是页,每一页能存放8060个字节。当表上存在聚集索引时,页的组织方式是通过B树方式。在聚集索引B树上,只有叶子节点存放实际数据,每个叶子节点为一页,而SQLServer每个页内存储数据的最小的单位是row,当叶子节点新插入或更新导致叶子节点无法容纳时,就会进行页分裂,在分裂过程中就产生了碎片。
replication-manager:复制集群管理组件
replication-manager是signal18开源的一款数据库高可用工具,采用go语言开发。支持MySQL、MariaDB、Percona,其包含一下功能特性:
- 复制监控
- 复制拓扑检测
- 主从切换(switchover)
- 主节点故障切换(failover)
- 大多数场景下数据零丢失
- 多群集管理
- 支持proxy(proxysql,haproxy等)
你的MySQL5.5还好么?
组提交性能问题
在MySQL5.6之前只支持redo日志组提交,如果在环境中开启了binlog,那binlog只能只能串行写入,无法进行组提交,导致数据库整体性能下降非常严重。
开启binglog
1 | [ 10s ] thds: 100 tps: 1391.16 qps: 1391.16 (r/w/o: 0.00/1391.16/0.00) lat (ms,95%): 150.29 err/s: 0.00 reconn/s: 0.00 |
数据文件创建错误修复
flush privileges是必要的么
在MySQL执行grant修改用户权限后,都习惯性执行一条flush privileges命令想让修改生效。在刚接触MySQL的时候我也是严格遵守该规范,但似乎并没有去了解flush privileges后面的具体操作,以及这个命令是否真的必要
SQLServer通过临时表进行数据批量删除
该不该使用COUNT(*)
现实见过在许多开发规范要求中禁止使用count(*),那有没有对此产生过怀疑呢,为什么数据库系统不记录总行数?为什么要禁用count(*)?count(*)与count(1)以及count(字段)有什么区别?
Bug 83713:Slave failed to initialize relay log info after OS crash when use MTS and GTID
在一次物理机异常蓝屏导致一台从数据库hang住后,通过重启恢复之后启动数据库时错误日志中出现如下错误
1 | 2020-05-07T00:33:05.503723Z 80 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. |
Python数据类型
变量
在python中创建变量无需指定变量类型,变量的值是可以修改的,也可以删除指定变量对象.
1 | #单个变量赋值 |
dbdeployer工具
dbdeployer能够快速部署数据库测试环境,一键实现Oracle MySQL、Percona MySQL、MariaDB、TiDB、MySQL NDB Cluster、PXC等测试环境的构建。
项目地址:dbdeployer
MySQL ERROR 1071
日前应用在MySQL5.6上执行ALTER修改字段长度时出现”ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes”的错误。这里的长度是指的索引长度,并不是字段长度限制。
percona-toolkit : pt-query-digest
pt-query-digest是Percona Toolkit工具集中常用的一个工具,其能够分析MySQL的slowlog,general log,binlog文件,同时也可以使用show processlist或者tcpdump抓取的MySQL协议数据进行分析。
MySQL JSON数据类型
MySQL ONLINE DDL
ONLINE DDL
ONLINE DDL是MySQL 5.6开始引入的,能够在DDL执行期间不影响正常的DML操作,提高数据并发能力。Online DDL可分为三种情况:
- copy(ALGORITHM=copy):5.6之前DDL的执行方式,由Server层创建临时表,进行数据拷贝。在DDL执行期间,DML无法执行。innodb中不支持inplace方式执行的都会自动使用copy,而MyISAM表只能使用copy方式。
- inplace(ALGORITHM=inplace):DDL所有步骤都在innodb引擎完成,在DDL执行期间不影响DML操作,所有操作都是online的。inplace带有日志记录和重放功能,当在需要rebuild重建表时,会申请row log空间记录DDL期间所有DML操作,再重放至临时表。
- inplace(offline):DDL过程是ONLINE的一定采用inplace,但inplace的DDL并不一定ONLINE,截止到8.0中创建全文索引(fulltext index)或空间索引(spatial index)都是采用inplace但会阻塞DML的情况。
回收站过大导致表空间查询缓慢
目前数据库查询表空间使用率非常慢,甚至要半个小时才会出结果。查询语句的执行计划如下:
1 | SQL>explain plan for select t.* |
外键无索引引起的TM表锁
现象
数据库等待事件出现大量TM表锁,造成数据库严重等待。经过查询引起的SQL为简单的DELETE语句
1 | DELETE FROM INSP.WF_XXX_XXX WHERE PROCESS_ID='8a80841663fb6dc00164d051ddd3240c'; |
Oracle High-Water Mark
MySQL客户端命令
控制文件恢复场景
RMAN基础知识
Oracle FlashBack(闪回)
Oracle Restore Point
MySQL复制延迟问题-Queueing master event to the relay log
近日,突然收到数据库同步延迟告警短信,登陆数据库后发现一个从节点确实存在复制延迟情况,并且还在不断增长
1 | mysql> show slave status\G |
MySQL复制:并行复制
MySQL复制:复制模式
Ops Manager安装部署
MySQL透明表空间传输
透明表空间传输能够使用物理复制的方式快速迁移一张表,通常用于数据表存在问题时,通过异机恢复后再以该方式将表快速恢复到生产环境中。
源表信息如下:
1 | root@test 15:56: select * from c; |
Redis4.0新特性
PSYNC2
在2.8到4.0之间的版本中,Redis同步机制为PSYNC1,在4.0中升级为PSYNC2。其中主要优化减少了全量同步的操作。比如下列场景:
- 在之前的版本中,主节点重启导致run id发生变化,从而导致从节点获取同步状态信息错误,必须重新拉取主节点的全量数据,如果此时主节点数据量过大,将可能同步失败并带来消耗大量资源性能
1
2
3
4
5
6
7
8
932716:M 01 Apr 16:58:50.209 * The server is now ready to accept connections on port 7379
32716:M 01 Apr 16:58:51.006 * Slave 10.0.139.162:7379 asks for synchronization
32716:M 01 Apr 16:58:51.006 * Partial resynchronization not accepted: Runid mismatch (Client asked for runid '7648f906ab47aca443a7a07853c6eece6fa50d80', my runid is 'ac3b862f1e65d83a23cc474115f09190bdcfdfdd')
32716:M 01 Apr 16:58:51.006 * Starting BGSAVE for SYNC with target: disk
32716:M 01 Apr 16:58:51.007 * Background saving started by pid 32719
32719:C 01 Apr 16:58:51.009 * DB saved on disk
32719:C 01 Apr 16:58:51.009 * RDB: 102 MB of memory used by copy-on-write
32716:M 01 Apr 16:58:51.010 * Background saving terminated with success
32716:M 01 Apr 16:58:51.010 * Synchronization with slave 10.0.139.162:7379 succeeded - PSYNC1因为网络中断或者阻塞导致主从中断,恢复后也需要从主节点重新同步一份全量数据。PSYNC2只需要同步延迟的数据
- 在进行链式复制,例如节点A->节点B->节点C架构,当节点A出现问题,C并不能正常同步B节点,当B节点作为主节点时,C节点需要全量同步一次B节点的数据,PSYNC2解决了这一问题。
- 在一主多从架构下,如果主节点故障,另一个节点提升为主节点,PYSYNC2只需要增量向新的主节点同步数据
MognoDB备份与恢复
MySQL数据备份恢复
数据库备份恢复是运维工作的重点,当发生数据丢失或异常,需要通过备份等手段恢复数据,保护数据安全。
备份类型分为三种:冷备、热备和温备,冷备即将数据库服务停止后对文件进行拷贝;热备即在线备份,备份过程中不影响业务正常运行;温备即对数据库全局加锁,禁止数据更新以达到备份一致性。
备份方式通常采用逻辑备份或物理备份,逻辑备份速度较慢,备份灵活,可针对实例、数据库、表、对象等进行备份,且不受版本影响;物理备份速度较快,备份不够灵活,跨版本之前可能存在兼容性问题。
制定备份策略应该综合考虑备份空间大小和恢复速度,全备周期短,空间使用就大;全备周期长,恢复起来就慢。
MySQL性能测试
MongoDB Aggregation(聚合)
MySQL Query_rewrite(查询重写)
MySQL从5.7.6开始支持Rewrite plugin插件,可以将符合条件的SQL语句进行改写。
安装插件
1 | [root@t-luhx03-v-szzb share]# mysql -uroot -p < /usr/local/mysql/share/install_rewriter.sql |
MongoDB GridFS
MongoDB索引
MySQL Join算法
MongoDB CRUD
Redis优化策略
MongoDB慢日志
MongoDB用户与角色
用户
在MongoDB启用AUTH认证后,需要通过用户名/密码以及认证数据库去连接实例,因此需要提前创建好相应的用户
USER文档描述
1 | { |
MongoDB基础知识
Oracle在线重定义表
Oracle数据库提供了一种机制,可以在不明显影响表的可用性情况下进行表结构更改。当表在线重定义时,在重定义过程中,可以对表进行查询或DML。该表仅在非常小的窗口期以独占模式被锁定,该窗口独立于表格的大小和重定义的复杂性,并且对用户完全透明。在线重定义表需要大量的空闲空间,大致为被重定义表的二倍空间,如果添加新列则需要更多的空间。
MySQL排序规则
Oracle行列转换函数
Redis Cluster
Oracle分区表
分区类型
范围分区(RANGE)
范围分区是将数据按范围映射到每一个分区里去,分区范围是在创建分区时指定的,例如经常使用的时间分区,把数据表按月分区。
1 | create table partition_tab |
Redis Sentinel+Twemproxy

Twemproxy的特性:
- 支持失败节点自动删除。可以设置重新连接该节点的时间;可以设置连接多少次之后删除节点
- 支持设置HashTag。通过HashTag可以自定义将两个key哈希到同一个实例上
- 减少与redis的直接连接数。保持与Redis的长连接;减少了客户端与服务器连接的链接数量
- 自动分片到后端多个Redis实例上。支持多种hash算法:MD5,CRC16,CRC32,CRC32a,hsieh,murmur,jenkins;支持多种分片算法:ketama(一致性hash算法的一种实现),modular,random;可以设置后端实例的权重
- 避免单节点问题。可以平行部署多个代理层,通过HAProxy做负载均衡,将redis的读写分散到多个twemproxy上
- 支持状态监控。可设置状态监控IP和端口,访问IP和端口可以得到一个JSON格式的状态信息;可设置监控信息刷新间隔时间
- 使用pipelining处理请求和响应。连接复用,内存复用;将多个连接请求组成redis pipelining统一redis请求
- 并不支持所有redis命令。不支持redis的事务操作;使用SIDFF,SDIFFSTORE,SINTER,SINTERSTORE,SMOVE,SUNION and SUNIONSTORE命令需要保证key在同一个分片上
Redis Sentinel(哨兵)
Redis sentinel是redis官方推荐的redis高可用(HA)解决方案。sentinel主要的功能包括:
- 监控(Monitoring),sentinel时刻监控着redis master-slave是否正常运行
- 通知(Notification),sentinel可以通过API来通知管理员,被监控的redis master-slave出现了问题
- 自动故障转移(Automatic failover),当redis master出现故障导致不可用状态,sentinel会进行故障转移,将slave提升为新的master,将其它slave将重新配置使用新的master同步,并使用redis的服务器应用程序在连接时使用新的地址连接
- 配置提供者(Configuration provider),sentinel作为在集群中的权威来源,客户端连接到sentinel来获取服务当前redis主节点的地址和其它信息。当故障转移发生时,sentinel会报告新的地址。
MySQL子查询优化
在MySQL中,针对不同的类型的子查询,优化器选择的优化策略也不同。对于IN、=ANY类子查询,优化器会选择如下策略:
- semijoin
- Materialization
- exists
对于NOT IN、<>ALL类子查询,优化器会选择如下策略:
Redis内存概述
内存分析
通常我们可以通过执行info memory来查看Redis的内存指标,通过分析指标来了解Redis的内存使用情况,其中的指标说明如下
- used_memory:Redis分配的内存总量,也就是所有数据占用的内存(Byte)
- used_memory_human:used_memory换算成MB输出
- used_memory_rss:从操作系统角度显示Redis进程占用的物理内存
- used_memory_peak:内存使用的最大值,表示used_memory的占用峰值
- used_memory_lua:Lua引擎消耗的内存大小
- mem_fragmentation_ratio:used_memory_rss/used_memory的比值,表示内存碎片率
- mem_allocator:Redis使用的内存分配器,默认为jemalloc
Redis Replication(主从复制)
Codis安装部署
MySQL执行计划分析
执行计划是在SQL性能优化时关注的重点,通过执行计划我们能够知道MySQL如何处理SQL,分析性能瓶颈并作出相应优化。
1 | root@employees 11:40: explain select * from titles where emp_no=10001; |
Redis客户端
Redis GEO
Redis3.2支持GEO(地理信息定位)功能,能够存储地理位置信息来实现附近的位置等依赖于地理位置信息的功能。
添加地理位置
1 | geoadd key longitude latitude member |
longitude、latitude、member分别是地理位置的经度、维度、成员。如果需要更新地理位置信息也可以使用geoadd命令。
MySQL获取索引树高度
假设表存在N行数据,每个索引节点平均有M个索引key,这时候索引的树高度则为logN/logM。由于索引页大小固定,KEY越小,M值就会越大,索引高度就越小,遍历树的效率就更高。
1 | mysql> select * from information_schema.innodb_sys_tables a left join information_schema.innodb_sys_indexes b on a.table_id=b.table_id where a.name='employees/employees'; |
Redis发布与订阅
Redis事务与Lua
MySQL Index
MySQL索引
索引用于提高查询效率,常见的索引数据结构有:哈希表、有序数组和搜索树。
- 哈希表以key-value形式存储,通过哈希函数查找key的位置获取对应value值。存储的数据是无序的,因此在做范围查询时需要全表扫描,性能很差
- 有序数组是按顺序排列的,通过二分法能快速查询到对应数据,包括范围查询。但更新效率太低,往中间插入新数据时需要挪动后面的所有记录。适用于静态只读数据
- 二叉树的特点在于每个节点的左儿子小于父节点,右儿子大于父节点,通过树搜索效率很高。但二叉树索引不止存在于内存,也存在于磁盘上,如果二叉树树高太深,也需要遍历多次磁盘,效率大打折扣。因此更多数据库系统都采用N叉树或B+树,减少磁盘遍历次数。
Redis持久化策略
MySQL临时表
MySQL临时表是一种特殊的数据对象,它具有以下几个特点:
- 临时表只能被创建它的会话访问,对其他线程不可见
- 临时表可以用普通表重名,操作默认都是针对临时表
- show tables是无法看见临时表的
- 当会话结束后,自动删除临时表
Redis Key管理
键重命名
1 | rename key newkey |
如果在重命名之前新的键名已经存在将会对其值进行覆盖,为了防止被强制rename,可以使用renamenx命令,确保只有新的key不存在时才会覆盖。
在rename的时候还有以下两点需要注意:
MySQL死锁分析(二)
当前业务出现死锁情况,其操作流程为批量DELETE再批量INSERT,经过排查发现是由于二级唯一索引在DELETE之后未完全被purge回收,再批量插入时互相等待造成的死锁。这里需要说明的是,当记录被DELETE删除后该行记录会被标识为DELETE_MARK状态,此时并没有真正地被回收,只有等purge线程回收后才是真正意义的被删除。
Redis数据结构
Redis有5种基础数据结构,分别为:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。所有数据结构都是key-value形式,通过唯一key来获取对应的value值,不同数据结构的差异在于value结构不同。
MySQL死锁分析(一)
在针对存在唯一索引的表中并发插入数据时,可能会触发死锁问题,今天我们就一起来探讨该死锁产生的原因。先准备测试案例,创建带有唯一索引的表A
1 | mysql> desc a; |
Redis安装部署
MySQL事务与锁
MySQL物理文件
MySQL Page Compression
InnoDB逻辑存储结构
MySQL体系结构
MySQL基本上可以分为Server层和引擎层。Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖了MySQL的大部分核心服务以及所有的内置函数;存储引擎层负责数据的存储和提取,其架构为插件形式,支持Innodb、MyISAM、Memory等多种存储引擎,目前OLTP系统大多数采用InnoDB,从MySQL5.5开始便作为默认存储引擎存在。
MySQL安装部署之MGR
SQLServer镜像部署
SQLServer静默安装
数据库安装
编辑响应文件
1 | ;SQL Server 2014 Configuration File |
基于Linux的SQL Server安装
MySQL安装部署之MHA
MySQL安装部署之Orchestrator

Orchestrator是GO编写的MySQL高可用性和复制拓扑管理工具,支持复制拓扑结构的调整,自动故障转移和手动主从切换等。提供Web界面展示MySQL复制的拓扑关系及状态,也可以在Web上更改MySQL的复制关系和部分配置信息,同时也提供命令行和api接口,方便运维管理。相比较MHA来看最重要的是解决了管理节点的单点问题,其通过raft协议保证本身的高可用
PLSQL-ROWID分区实现高效DELETE
PLSQL-高级分组
PLSQL-Model子句
PLSQL-分层查询
OGG常用错误处理
OGG常用参数
MGR进程参数
参数 | 说明 |
---|---|
PORT | 指定服务监听端口,默认端口为7809 |
DYNAMICPORTLIST | 动态端口,当指定端口不可用时,MGR进程会从动态端口中选择一个可用端口 |
COMMENT | 注释行,等价于– |
AUTOSTART | MGR进程启动时自动启动指定进程 |
AUTORESTART | 自动重启进程。例如:AUTORESTART EXTRACT,RETRIES 5,WAITMINUTES 3表示当EXTRACT进程异常时,每三分钟尝试重启所有EXTRACT进程,尝试五次 |
PURGEOLDEXTRACTS | 定期清理指定目录下的trail文件,例如:PURGEOLDEXTRACTS ./dirdat/,usecheckpoints,minkeepdays 3 表示对超过三天的trail文件进行清理 |
LAGREPORT / LAGINFO / LAGCRITICAL | 设置延迟告警阀值,例如:LAGREPORTHOURS 1 LAGINFOMINUTES 30 LAGCRITICALMINUTES 60表示每小时进行一次延迟检查,延迟超过30分钟则以普通信息输出到错误日志文件中,如果超过60分钟则以警告的形式记录到错误日志中 |
CHECKMINUTES | 定义MGR检查和告警的频率 |
OGG新增同步表
OGG双向同步
OGG同步Oracle到SQLServer
安装OGG软件
选择数据库版本
指定安装路径以及数据库路径
OGG FOR SQL Server Download
View Password:j6mh
数据库配置
开启强制日志、附加日志、并确定处于归档模式
1 | SQL> ALTER DATABASE FORCE LOGGING; |
OGG同步Oracle到Oracle
Oracle11.2.0.3升级到11.2.0.4
查看数据库信息
1 | SQL> select DBID,NAME,LOG_MODE,PLATFORM_NAME,CURRENT_SCN,DB_UNIQUE_NAME from v$database; |
Oracle数据库静默安装
MySQL安装部署之PXC
MySQL安装部署之单实例
ELK日志平台初体验
Percona for MongoDB上手
MongoDB环境部署
Prometheus监控可视化
Zabbix安装配置
MySQL安装配置
略。请参考MySQL相关文章
创建zabbix数据库
1 | sql> create database zabbix character set utf8 collate utf8_bin; |
Windows安装.net3.5
下载离线安装包
Download
将文件重命名为NetFx3.cab并放入C:\windows下
powershell执行安装
1 | dism /online /Enable-Feature /all /FeatureName:NetFx3 /Source:"%windir%" /LimitAccess |