0%

Anemometer 是一个MySQL慢日志展示的工具,结合pt-query-digest,输出较为详细的MySQL慢查询信息,有助于性能优化分析。Anemometer为B/S架构,WEB端依赖于LAMP,因此我们需要安装配置MySQL、PHP、Apache,其数据来源于pt-query-digest,因此我们还需要安装percona-toolkit。

阅读全文 »

现象:

Centos7.2通过df -h查看目录使用率卡住,无法结束

分析:

通过strace命令跟踪df命令,发现在stat(“/proc/sys/fs/binfmt_misc处卡住,查看unit状态

1
2
3
4
$ systemctl list-units -all | grep binfmt
proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Formats File System Automount Point
proc-sys-fs-binfmt_misc.mount loaded inactive dead Arbitrary Executable File Formats File System
systemd-binfmt.service loaded inactive dead Set Up Additional Binary Formats
阅读全文 »

分区概述

如Oracle一样,MySQL也支持根据规则对表进行分区,分区后还是一张完整的表,只是将分区数据分散到不同的数据文件中。表分区带来的优化在于当查询条件包含分区键时,性能得到提升。并且我们也可以单独对指定分区进行操作,提升了分区表的可操作性,例如单独清理往年历史分区数据。

阅读全文 »

安装pmm客户端

下载安装客户端DownLoad

1
$ rpm -ivh pmm2-client-2.10.1-6.el7.x86_64.rpm

客户端连接到server

1
$ pmm-admin config --server-insecure-tls --server-url=https://admin:Abcd123@10.0.139.163:443
阅读全文 »

PMM是由Percona开源的,用于管理和监视MySQL和MongoDB性能,是一个不错的性能监控工具。PMM主要由client和server构成,client部署在每个监控主机上,收集服务器指标、常规系统指标和查询分析数据;server用于聚合收集的数据,在web中以图表形式进行展现。
pmm

阅读全文 »

在基于ROW模式复制的环境下,slave_rows_search_algorithms参数控制如何在行中搜索匹配项,特别是是否使用Hash Scan,设置后会立即对所有复制通道生效。其值可设置为INDEX_SCAN、TABLE_SCAN、HASH_SCAN中指定两个值,以逗号分隔,参数默认值为INDEX_SCAN,TABLE_SCAN。常见的推荐组合及其效果如下:

阅读全文 »

在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内存管理使用的是glibc中的malloc(ptmalloc),实际效果并不是很理想,内存占用率和性能都相对较差。而tcmalloc是由google开源的gperftools其中一个组件,对比默认的malloc来说是一种更好的选择,当然也可以选择MariaDB和redis都采用的jemalloc。项目地址

阅读全文 »

查询优化器负责将SQL查询转换为尽可能高效的执行计划,但随着数据环境不断变化,查询优化器可能无法找到最佳的执行计划,导致SQL效率低下。造成这种情况的原因是优化器对查询的数据了解的不够充足,例如:每个表有多少行数据,每列中有多少不同的值,每列的数据分布情况。

阅读全文 »

项目概述

Otter是基于数据库增量日志解析,准实时同步到本地机房或异地机房的MySQL/Oracle数据库。
Otter

  • Otter基于canal实现数据库增量日志数据的获取
  • manager运行过程中推送同步配置到node节点
  • node节点将同步状态反馈到manager
  • 基于zookeeper,解决分布式状态调度,允许多个node节点协同工作
阅读全文 »

函数索引

在MySQL8.0之前对条件字段做函数操作、或者做运算都将不会使用字段上的索引,例如下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@employees 14:09:  show index from employees;
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| employees | 0 | PRIMARY | 1 | emp_no | A | 299232 | NULL | NULL | | BTREE | | |
| employees | 1 | inx_date | 1 | birth_date | A | 4739 | NULL | NULL | | BTREE | | |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

root@employees 14:10: explain select * from employees where month(birth_date)=9;
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299232 | 100.00 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
阅读全文 »

安装Git

下载Git

DownLoad

解压Git

1
[root@t-luhx01-v-szzb ~]# tar -xvf git-2.3.0.tar.gz

编译安装Git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@t-luhx01-v-szzb ~]# cd git-2.3.0
[root@t-luhx01-v-szzb git-2.3.0]# ./configure --prefix=/usr/local/git
[root@t-luhx01-v-szzb git-2.3.0]# make && make install -j 4
[root@t-luhx01-v-szzb git-2.3.0]# echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/profile
[root@t-luhx01-v-szzb git-2.3.0]# source /etc/profile
[root@t-luhx01-v-szzb git-2.3.0]# git
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]

The most commonly used git commands are:
add Add file contents to the index
bisect Find by binary search the change that introduced a bug
branch List, create, or delete branches
checkout Checkout a branch or paths to the working tree
clone Clone a repository into a new directory
commit Record changes to the repository
diff Show changes between commits, commit and working tree, etc
fetch Download objects and refs from another repository
grep Print lines matching a pattern
init Create an empty Git repository or reinitialize an existing one
log Show commit logs
merge Join two or more development histories together
mv Move or rename a file, a directory, or a symlink
pull Fetch from and integrate with another repository or a local branch
push Update remote refs along with associated objects
rebase Forward-port local commits to the updated upstream head
reset Reset current HEAD to the specified state
rm Remove files from the working tree and from the index
show Show various types of objects
status Show the working tree status
tag Create, list, delete or verify a tag object signed with GPG
阅读全文 »

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。

阅读全文 »

心跳(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进程状态和本地节点的状态。

数值类型

数值类型由两字节、四字节、八字节整数、四字节和八字节浮点数以及可选精度小数组成。下表列出了可用的类型

类型 字节数 范围
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
阅读全文 »

操作系统配置

安装依赖包

1
2
3
4
5
yum -y install coreutils glib2 lrzsz dstat sysstat e4fsprogs xfsprogs \
ntp readline-devel zlib-devel openssl-devel pam-devel libxml2-devel \
libxslt-devel python-devel tcl-devel gcc gcc-c++ make smartmontools \
flex bison perl-devel perl-ExtUtils* openldap-devel \
jadetex openjade bzip2 openssl
阅读全文 »

在MySQL5.7中,Innodb通过重新生成表(即使采用INPLACE DDL算法)向表添加列,其会存在以下问题:

  • 对于大表,可能重建时间会很长
  • 由于过程中会产生临时表,会占用磁盘空间
  • DDL占用较多资源
  • 对于复制,将会造成较大的同步延迟
阅读全文 »

为了解决MongoDB单点故障问题,推出了副本集复制功能,其中主节点用于处理客户端读写请求,从节点用于复制主节点的数据,当主节点故障时,副本集自动切换提升一个成员作为新的主节点继续提供服务。

阅读全文 »

MySQL8.0.17推出了Clone plugin功能,其允许用户对当前示例进行本地或远程克隆,对快速搭建复制环境,备份等场景非常有用。

  • 本地克隆:将数据从当前MySQL Server克隆到当前主机上的一个指定目录下面
  • 远程克隆:启动克隆的MySQL Server称之为recipient(接收者),远程数据源的MySQL Server称之为donor(提供者),在recipient上执行远程克隆,数据会通过网络传输到recipient。克隆过程中会覆盖清除recipient上的所有数据,如果不希望被覆盖需指定克隆数据放在其它目录
  • clone plugin支持在复制拓扑中使用。除了克隆数据外,克隆还会携带复制信息(binlog位置),并将其应用于接收方。我们可以用于在组复制中添加成员,也可以在主从环境中添加新的从节点。当组成员和待加入组的Server都支持Clone plugin,待加入的组成员可以自行选择一个更高效的方式获取数据。
  • 克隆插件支持克隆数据加密的和数据页压缩
阅读全文 »

Haproxy简介

Haproxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用

阅读全文 »

keepalived是集群管理中保证集群高可用的一个服务软件,功能类似于heartbeat,防止单点故障。keepalived是以VRRP协议为实现基础的,VRRP即虚拟路由冗余协议。该协议将N台提供相同功能的路由器组成一个路由器组,这个组里面有个master和多个backup,master上绑定一个对外提供服务的VIP。当backup收不到vrrp包时,就会认为当前master宕机了,这时将根据定义的优先级从backup中选举一个新的master。

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function filesize ([string]$filepath)
{
if($filepath -eq $null){
throw "null path"
}
dir -Path $filepath | ForEach-Object -Process{
if($_.psiscontainer -eq $true){
$length=0
dir -Path $_.fullname -Recurse | ForEach-Object{
$length+=$_.length
}
$l=$length/1GB
$_.name+" size is : {0:n3} GB" -f $l
}
}
}
filesize -filepath "C:\"

Redo Log Archiving

在MySQL8.0中启用了redo log archive的功能,旨在解决一致性备份问题。在之前的版本中,由于redo是固定大小循环写入的,如果备份速度跟不上redo log生成的速度,则无法保持备份一致性。redo log archive在备份启动时同步启动,备份结束时停止,此时可以利用redo log归档进行数据恢复。

阅读全文 »

MySQL5.7

在5.7中想要实现角色功能的话可以借助proxies_priv来简单实现,要想使用proxies_priv需要先开启相关参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@(none) 17:28:  set global check_proxy_users =on;
Query OK, 0 rows affected (0.00 sec)

root@(none) 17:29: set global mysql_native_password_proxy_users = on;
Query OK, 0 rows affected (0.00 sec)

root@(none) 17:29: show variables like "%proxy%";
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| check_proxy_users | ON |
| mysql_native_password_proxy_users | ON |
| proxy_user | |
+-----------------------------------+-------+
阅读全文 »

安装插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@(none) 15:32:  INSTALL PLUGIN Rewriter SONAME 'rewriter.so';
root@(none) 15:07: INSTALL PLUGIN clone SONAME 'mysql_clone.so';

root@(none) 15:32: SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+

root@(none) 15:32: SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'Rewriter';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| Rewriter | ACTIVE |
+-------------+---------------+
阅读全文 »

在MySQL8.0.18之前,针对唯一索引或主键索引进行范围条件加锁时,向右遍历过程中,会一直扫描并加next-key锁到第一个不满足条件的记录为止,然后退化为间隙锁,但RR隔离级别下并不会退化,也就是锁的范围扩大了,严格来说这算是一个bug,这一问题直到8.0.18总算被优化了。

阅读全文 »

升级检查

mysqlcheck

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@centos7-4 service]# mysqlcheck -uroot -p --all-databases --check-upgrade
mysqlcheck: [Warning] Using a password on the command line interface can be insecure.
confluence.ao_187ccc_sidebar_link OK
confluence.ao_21d670_whitelist_rules OK
confluence.ao_26db7f_entities_to_room_cfg OK
confluence.ao_26db7f_entities_to_rooms OK
confluence.ao_38321b_custom_content_link OK
confluence.ao_42e351_health_check_entity OK
confluence.ao_54c900_c_template_ref OK
confluence.ao_54c900_content_blueprint_ao OK
confluence.ao_54c900_space_blueprint_ao OK
confluence.ao_5f3884_feature_discovery OK
confluence.ao_5fb9d7_aohip_chat_link OK
confluence.ao_5fb9d7_aohip_chat_user OK
confluence.ao_6384ab_discovered OK
confluence.ao_6384ab_feature_metadata_ao OK
confluence.ao_7cde43_event OK
confluence.ao_7cde43_filter_param OK
confluence.ao_7cde43_notification OK
confluence.ao_7cde43_notification_scheme OK
confluence.ao_7cde43_recipient OK
confluence.ao_7cde43_server_config OK
confluence.ao_7cde43_server_param OK
confluence.ao_88263f_health_check_status OK
阅读全文 »

当我们通过下列SQL查询数据库当前正在执行的SQL时,我们会发现wait_resource时常会出现等待,今天就来对常见的等待对象类型进行介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
[session_id],
[request_id],
[start_time] AS '开始时间',
[status] AS '状态',
[command] AS '命令',
dest.[text] AS 'sql语句',
DB_NAME([database_id]) AS '数据库名',
[blocking_session_id] AS '正在阻塞其他会话的会话ID',
[wait_type] AS '等待资源类型',
[wait_time] AS '等待时间',
[wait_resource] AS '等待的资源',
[reads] AS '物理读次数',
[writes] AS '写次数',
[logical_reads] AS '逻辑读次数',
[row_count] AS '返回结果行数'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
ORDER BY [cpu_time] DESC
阅读全文 »

在SQL Server中,存储数据最小的单位是页,每一页能存放8060个字节。当表上存在聚集索引时,页的组织方式是通过B树方式。在聚集索引B树上,只有叶子节点存放实际数据,每个叶子节点为一页,而SQLServer每个页内存储数据的最小的单位是row,当叶子节点新插入或更新导致叶子节点无法容纳时,就会进行页分裂,在分裂过程中就产生了碎片。

阅读全文 »

replication-manager是signal18开源的一款数据库高可用工具,采用go语言开发。支持MySQL、MariaDB、Percona,其包含一下功能特性:

  • 复制监控
  • 复制拓扑检测
  • 主从切换(switchover)
  • 主节点故障切换(failover)
  • 大多数场景下数据零丢失
  • 多群集管理
  • 支持proxy(proxysql,haproxy等)
阅读全文 »

组提交性能问题

在MySQL5.6之前只支持redo日志组提交,如果在环境中开启了binlog,那binlog只能只能串行写入,无法进行组提交,导致数据库整体性能下降非常严重。

开启binglog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[ 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
[ 20s ] thds: 100 tps: 1302.81 qps: 1302.81 (r/w/o: 0.00/1302.81/0.00) lat (ms,95%): 167.44 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 100 tps: 1305.70 qps: 1305.70 (r/w/o: 0.00/1305.70/0.00) lat (ms,95%): 173.58 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 100 tps: 1354.09 qps: 1354.09 (r/w/o: 0.00/1354.09/0.00) lat (ms,95%): 158.63 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 100 tps: 1354.20 qps: 1354.20 (r/w/o: 0.00/1354.20/0.00) lat (ms,95%): 158.63 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 100 tps: 1188.90 qps: 1188.90 (r/w/o: 0.00/1188.90/0.00) lat (ms,95%): 196.89 err/s: 0.00 reconn/s: 0.00
[ 70s ] thds: 100 tps: 1060.10 qps: 1060.10 (r/w/o: 0.00/1060.10/0.00) lat (ms,95%): 235.74 err/s: 0.00 reconn/s: 0.00
[ 80s ] thds: 100 tps: 1163.70 qps: 1163.70 (r/w/o: 0.00/1163.70/0.00) lat (ms,95%): 200.47 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 100 tps: 1216.50 qps: 1216.50 (r/w/o: 0.00/1216.50/0.00) lat (ms,95%): 189.93 err/s: 0.00 reconn/s: 0.00
[ 100s ] thds: 100 tps: 1250.09 qps: 1250.09 (r/w/o: 0.00/1250.09/0.00) lat (ms,95%): 183.21 err/s: 0.00 reconn/s: 0.00
SQL statistics:
queries performed:
read: 0
write: 125975
other: 0
total: 125975
transactions: 125975 (1257.66 per sec.)
queries: 125975 (1257.66 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)

General statistics:
total time: 100.1647s
total number of events: 125975

Latency (ms):
min: 1.17
avg: 79.43
max: 788.50
95th percentile: 179.94
sum: 10006517.26

Threads fairness:
events (avg/stddev): 1259.7500/20.46
execution time (avg/stddev): 100.0652/0.04
阅读全文 »

生产环境采用ASM存储,在扩容表空间时,数据文件路径未添加+号,导致数据文件创建在ORACLE_HOME下了,需要将数据文件迁移到ASM中去

1、查询数据文件对应的ID

1
SQL> select file_name,file_id,tablespace_name from dba_data_files;
阅读全文 »

在MySQL执行grant修改用户权限后,都习惯性执行一条flush privileges命令想让修改生效。在刚接触MySQL的时候我也是严格遵守该规范,但似乎并没有去了解flush privileges后面的具体操作,以及这个命令是否真的必要

阅读全文 »

目前数据库中存在一张几千万行的日志表,按照数据保留策略仅需要保留最近一个月的数据,因此需要对历史数据进行清理。测试了几种方案最后选择了通过临时表来进行关联删除

1、在数据表上创建索引

1
CREATE INDEX IDX_ID ON dbo.Log(ID);
阅读全文 »

现实见过在许多开发规范要求中禁止使用count(*),那有没有对此产生过怀疑呢,为什么数据库系统不记录总行数?为什么要禁用count(*)?count(*)与count(1)以及count(字段)有什么区别?

阅读全文 »

在一次物理机异常蓝屏导致一台从数据库hang住后,通过重启恢复之后启动数据库时错误日志中出现如下错误

1
2
3
4
5
6
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.
2020-05-07T00:33:56.888307Z 81 [ERROR] Error in Log_event::read_log_event(): 'Event too small', data_len: 0, event_type: 0
2020-05-07T00:33:56.888330Z 81 [ERROR] Error reading relay log event for channel '': slave SQL thread aborted because of I/O error
2020-05-07T00:33:56.888348Z 81 [ERROR] Slave SQL for channel '': Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave. Error_code: 1594
2020-05-07T00:33:56.888352Z 81 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'FIRST' position 386502095
2020-05-06T15:48:25.440945Z 133 [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中创建变量无需指定变量类型,变量的值是可以修改的,也可以删除指定变量对象.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#单个变量赋值
>>> name='luhengxing'
>>> print(name)
luhengxing
>>> name='lhx'
>>> print(name)
lhx
#多个变量赋值
>>> a,b,c=1,2,3
>>> print(a,b,c)
1 2 3
#删除对象
>>> del a
>>> print(a)
Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
print(a)
NameError: name 'a' is not defined
阅读全文 »

dbdeployer能够快速部署数据库测试环境,一键实现Oracle MySQL、Percona MySQL、MariaDB、TiDB、MySQL NDB Cluster、PXC等测试环境的构建。

项目地址:dbdeployer

阅读全文 »

日前应用在MySQL5.6上执行ALTER修改字段长度时出现”ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes”的错误。这里的长度是指的索引长度,并不是字段长度限制。

阅读全文 »

pt-query-digest是Percona Toolkit工具集中常用的一个工具,其能够分析MySQL的slowlog,general log,binlog文件,同时也可以使用show processlist或者tcpdump抓取的MySQL协议数据进行分析。

阅读全文 »

MySQL 5.7.8开始对JSON数据类型的支持,JSON不再以字符串形式存储,而是转换为内部二进制存储格式,能够自动验证JSON内容,无效JSON文档会产生错误。二进制结构能够直接通过键或数组索引查找子对象或嵌套值,而无需遍历整个列。

阅读全文 »

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
SQL>explain plan for select t.*
    from (select d.tablespace_name,
                              space "sum_space(m)",
                              blocks sum_blocks,
                              space - nvl(free_space, 0) "used_space(m)",
                              round((1 - nvl(free_space, 0) / space) * 100, 2) "used_rate(%)",
                              free_space "free_space(m)"
                    from (select tablespace_name,
                                              round(sum(bytes) / (1048576), 2) space,
                                              sum(blocks) blocks
                                    from dba_data_files
                                  group by tablespace_name) d,
                              (select tablespace_name,
                                              round(sum(bytes) / (1048576), 2) free_space
                                    from dba_free_space
                                  group by tablespace_name) f
                  where d.tablespace_name = f.tablespace_name(+)
                union all --if have tempfile
                select d.tablespace_name,
                              space "sum_space(m)",
                              blocks sum_blocks,
                              used_space "used_space(m)",
                              round(nvl(used_space, 0) / space * 100, 2) "used_rate(%)",
                              space - used_space "free_space(m)"
                    from (select tablespace_name,
                                              round(sum(bytes) / (1048576), 2) space,
                                              sum(blocks) blocks
                                    from dba_temp_files
                                  group by tablespace_name) d,
                              (select tablespace,
                                              round(sum(blocks * 32768) / (1048576), 2) used_space
                                    from v$sort_usage
                                  group by tablespace) f
                  where d.tablespace_name = f.tablespace(+)) t
order by "used_rate(%)" desc;
SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
Plan hash value: 1739573977
-----------------------------------------------------------------------------------------------------------
  
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  
-----------------------------------------------------------------------------------------------------------
  
| 0 | SELECT STATEMENT | | 3 | 246 | 4386 (5)| 00:00:53 |
  
| 1 | SORT ORDER BY | | 3 | 246 | 4386 (5)| 00:00:53 |
  
| 2 | VIEW | | 3 | 246 | 4385 (5)| 00:00:53 |
  
| 3 | UNION-ALL | | | | | |
  
|* 4 | HASH JOIN OUTER | | 2 | 146 | 4382 (5)| 00:00:53 |
  
| 5 | VIEW | | 2 | 86 | 5 (20)| 00:00:01 |
  
| 6 | HASH GROUP BY | | 2 | 70 | 5 (20)| 00:00:01 |
  
| 7 | VIEW | DBA_DATA_FILES | 2 | 70 | 4 (0)| 00:00:01 |
  
| 8 | UNION-ALL | | | | | |
  
| 9 | NESTED LOOPS | | 1 | 359 | 2 (0)| 00:00:01 |
  
| 10 | NESTED LOOPS | | 1 | 343 | 1 (0)| 00:00:01 |
  
| 11 | NESTED LOOPS | | 1 | 330 | 1 (0)| 00:00:01 |
  
|* 12 | FIXED TABLE FULL | X$KCCFN | 1 | 310 | 0 (0)| 00:00:01 |
  
|* 13 | TABLE ACCESS BY INDEX ROWID| FILE$ | 1 | 20 | 1 (0)| 00:00:01 |
  
|* 14 | INDEX UNIQUE SCAN | I_FILE1 | 1 | | 0 (0)| 00:00:01 |
  
|* 15 | FIXED TABLE FIXED INDEX | X$KCCFE (ind:1) | 1 | 13 | 0 (0)| 00:00:01 |
  
| 16 | TABLE ACCESS CLUSTER | TS$ | 1 | 16 | 1 (0)| 00:00:01 |
  
|* 17 | INDEX UNIQUE SCAN | I_TS# | 1 | | 0 (0)| 00:00:01 |
  
| 18 | NESTED LOOPS | | 1 | 402 | 2 (0)| 00:00:01 |
  
| 19 | NESTED LOOPS | | 1 | 386 | 1 (0)| 00:00:01 |
  
| 20 | NESTED LOOPS | | 1 | 373 | 1 (0)| 00:00:01 |
  
| 21 | NESTED LOOPS | | 1 | 362 | 0 (0)| 00:00:01 |
  
|* 22 | FIXED TABLE FULL | X$KCCFN | 1 | 310 | 0 (0)| 00:00:01 |
  
|* 23 | FIXED TABLE FIXED INDEX | X$KTFBHC (ind:1) | 1 | 52 | 0 (0)| 00:00:01 |
  
|* 24 | TABLE ACCESS BY INDEX ROWID| FILE$ | 1 | 11 | 1 (0)| 00:00:01 |
  
|* 25 | INDEX UNIQUE SCAN | I_FILE1 | 1 | | 0 (0)| 00:00:01 |
  
|* 26 | FIXED TABLE FIXED INDEX | X$KCCFE (ind:1) | 1 | 13 | 0 (0)| 00:00:01 |
  
| 27 | TABLE ACCESS CLUSTER | TS$ | 1 | 16 | 1 (0)| 00:00:01 |
  
|* 28 | INDEX UNIQUE SCAN | I_TS# | 1 | | 0 (0)| 00:00:01 |
  
| 29 | VIEW | | 51 | 1530 | 4377 (5)| 00:00:53 |
  
| 30 | HASH GROUP BY | | 51 | 1122 | 4377 (5)| 00:00:53 |
  
| 31 | VIEW | DBA_FREE_SPACE | 18911 | 406K| 4376 (5)| 00:00:53 |
  
| 32 | UNION-ALL | | | | | |
  
| 33 | NESTED LOOPS | | 1 | 66 | 4 (0)| 00:00:01 |
  
| 34 | NESTED LOOPS | | 1 | 59 | 4 (0)| 00:00:01 |
  
| 35 | TABLE ACCESS FULL | FET$ | 1 | 39 | 4 (0)| 00:00:01 |
  
|* 36 | TABLE ACCESS CLUSTER | TS$ | 1 | 20 | 0 (0)| 00:00:01 |
  
|* 37 | INDEX UNIQUE SCAN | I_TS# | 1 | | 0 (0)| 00:00:01 |
  
|* 38 | INDEX UNIQUE SCAN | I_FILE2 | 1 | 7 | 0 (0)| 00:00:01 |
  
| 39 | NESTED LOOPS | | 67 | 4824 | 22 (0)| 00:00:01 |
  
| 40 | NESTED LOOPS | | 67 | 4355 | 22 (0)| 00:00:01 |
  
|* 41 | TABLE ACCESS FULL | TS$ | 51 | 1326 | 22 (0)| 00:00:01 |
  
|* 42 | FIXED TABLE FIXED INDEX | X$KTFBFE (ind:1) | 1 | 39 | 0 (0)| 00:00:01 |
  
|* 43 | INDEX UNIQUE SCAN | I_FILE2 | 1 | 7 | 0 (0)| 00:00:01 |
  
|* 44 | HASH JOIN | | 18842 | 1214K| 3127 (6)| 00:00:38 |
  
|* 45 | TABLE ACCESS FULL | TS$ | 51 | 1326 | 22 (0)| 00:00:01 |
  
|* 46 | HASH JOIN | | 18985 | 741K| 3105 (6)| 00:00:38 |
  
| 47 | INDEX FULL SCAN | I_FILE2 | 146 | 1022 | 1 (0)| 00:00:01 |
  
| 48 | NESTED LOOPS | | 887K| 27M| 3100 (6)| 00:00:38 |
  
| 49 | TABLE ACCESS FULL | RECYCLEBIN$ | 887K| 10M| 2940 (1)| 00:00:36 |
  
|* 50 | FIXED TABLE FIXED INDEX | X$KTFBUE (ind:1) | 1 | 21 | 0 (0)| 00:00:01 |
  
| 51 | NESTED LOOPS | | 1 | 91 | 1223 (1)| 00:00:15 |
  
| 52 | NESTED LOOPS | | 49300 | 91 | 1223 (1)| 00:00:15 |
  
| 53 | NESTED LOOPS | | 1 | 79 | 23 (0)| 00:00:01 |
  
| 54 | NESTED LOOPS | | 1 | 72 | 23 (0)| 00:00:01 |
  
| 55 | TABLE ACCESS FULL | UET$ | 1 | 52 | 23 (0)| 00:00:01 |
  
|* 56 | TABLE ACCESS CLUSTER | TS$ | 1 | 20 | 0 (0)| 00:00:01 |
  
|* 57 | INDEX UNIQUE SCAN | I_TS# | 1 | | 0 (0)| 00:00:01 |
  
|* 58 | INDEX UNIQUE SCAN | I_FILE2 | 1 | 7 | 0 (0)| 00:00:01 |
  
|* 59 | INDEX RANGE SCAN | RECYCLEBIN$_TS | 49300 | | 336 (0)| 00:00:05 |
  
|* 60 | TABLE ACCESS BY INDEX ROWID | RECYCLEBIN$ | 2 | 24 | 1200 (1)| 00:00:15 |
  
|* 61 | HASH JOIN OUTER | | 1 | 73 | 3 (67)| 00:00:01 |
  
| 62 | VIEW | | 1 | 43 | 2 (50)| 00:00:01 |
  
| 63 | HASH GROUP BY | | 1 | 417 | 2 (50)| 00:00:01 |
  
| 64 | NESTED LOOPS | | 1 | 417 | 1 (0)| 00:00:01 |
  
| 65 | NESTED LOOPS | | 1 | 365 | 1 (0)| 00:00:01 |
  
| 66 | NESTED LOOPS | | 1 | 349 | 0 (0)| 00:00:01 |
  
|* 67 | FIXED TABLE FULL | X$KCCFN | 1 | 297 | 0 (0)| 00:00:01 |
  
|* 68 | FIXED TABLE FIXED INDEX | X$KTFTHC (ind:1) | 1 | 52 | 0 (0)| 00:00:01 |
  
| 69 | TABLE ACCESS CLUSTER | TS$ | 1 | 16 | 1 (0)| 00:00:01 |
  
|* 70 | INDEX UNIQUE SCAN | I_TS# | 1 | | 0 (0)| 00:00:01 |
  
|* 71 | FIXED TABLE FIXED INDEX | X$KCCTF (ind:1) | 1 | 52 | 0 (0)| 00:00:01 |
  
| 72 | VIEW | | 1 | 30 | 1 (100)| 00:00:01 |
  
| 73 | HASH GROUP BY | | 1 | 172 | 1 (100)| 00:00:01 |
  
| 74 | NESTED LOOPS | | 1 | 172 | 0 (0)| 00:00:01 |
  
| 75 | NESTED LOOPS | | 1 | 159 | 0 (0)| 00:00:01 |
  
| 76 | MERGE JOIN CARTESIAN | | 100 | 8800 | 0 (0)| 00:00:01 |
  
|* 77 | FIXED TABLE FULL | X$KTSSO | 1 | 62 | 0 (0)| 00:00:01 |
  
| 78 | BUFFER SORT | | 100 | 2600 | 0 (0)| 00:00:01 |
  
| 79 | FIXED TABLE FULL | X$KSLWT | 100 | 2600 | 0 (0)| 00:00:01 |
  
|* 80 | FIXED TABLE FIXED INDEX | X$KSUSE (ind:1) | 1 | 71 | 0 (0)| 00:00:01 |
  
|* 81 | FIXED TABLE FIXED INDEX | X$KSLED (ind:2) | 1 | 13 | 0 (0)| 00:00:01 |
  
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
      4 - access("D"."TABLESPACE_NAME"="F"."TABLESPACE_NAME"(+))
  
    12 - filter("FNNAM" IS NOT NULL AND "FNTYP"=4 AND "INST_ID"=USERENV('INSTANCE') AND
  
                            BITAND("FNFLG",4)<>4)
  
    13 - filter("F"."SPARE1" IS NULL)
  
    14 - access("FNFNO"="F"."FILE#")
  
    15 - filter("FE"."FENUM"="F"."FILE#")
  
    17 - access("F"."TS#"="TS"."TS#")
  
    22 - filter("FNNAM" IS NOT NULL AND "FNTYP"=4 AND "INST_ID"=USERENV('INSTANCE') AND
  
                            BITAND("FNFLG",4)<>4)
  
    23 - filter("FNFNO"="HC"."KTFBHCAFNO")
  
    24 - filter("F"."SPARE1" IS NOT NULL)
  
    25 - access("FNFNO"="F"."FILE#")
  
    26 - filter("FE"."FENUM"="F"."FILE#")
  
    28 - access("HC"."KTFBHCTSN"="TS"."TS#")
  
    36 - filter("TS"."BITMAPPED"=0)
  
    37 - access("TS"."TS#"="F"."TS#")
  
    38 - access("F"."TS#"="FI"."TS#" AND "F"."FILE#"="FI"."RELFILE#")
  
    41 - filter("TS"."CONTENTS$"=0 AND "TS"."BITMAPPED"<>0 AND ("TS"."ONLINE$"=1 OR
  
                            "TS"."ONLINE$"=4))
  
    42 - filter("TS"."TS#"="F"."KTFBFETSN")
  
    43 - access("F"."KTFBFETSN"="FI"."TS#" AND "F"."KTFBFEFNO"="FI"."RELFILE#")
  
    44 - access("TS"."TS#"="RB"."TS#")
  
    45 - filter("TS"."CONTENTS$"=0 AND "TS"."BITMAPPED"<>0 AND ("TS"."ONLINE$"=1 OR
  
                            "TS"."ONLINE$"=4))
  
    46 - access("RB"."TS#"="FI"."TS#" AND "U"."KTFBUEFNO"="FI"."RELFILE#")
  
    50 - filter("U"."KTFBUESEGTSN"="RB"."TS#" AND "U"."KTFBUESEGFNO"="RB"."FILE#" AND
  
                            "U"."KTFBUESEGBNO"="RB"."BLOCK#")
  
    56 - filter("TS"."BITMAPPED"=0)
  
    57 - access("TS"."TS#"="U"."TS#")
  
    58 - access("U"."TS#"="FI"."TS#" AND "U"."SEGFILE#"="FI"."RELFILE#")
  
    59 - access("U"."TS#"="RB"."TS#")
  
    60 - filter("U"."SEGFILE#"="RB"."FILE#" AND "U"."SEGBLOCK#"="RB"."BLOCK#")
  
    61 - access("D"."TABLESPACE_NAME"="F"."TABLESPACE"(+))
  
    67 - filter("V"."FNNAM" IS NOT NULL AND "V"."FNTYP"=7)
  
    68 - filter("V"."FNFNO"="HC"."KTFTHCTFNO")
  
    70 - access("HC"."KTFTHCTSN"="TS"."TS#")
  
    71 - filter("TF"."TFDUP"<>0 AND BITAND("TF"."TFSTA",32)<>32 AND "V"."FNFNO"="TF"."TFNUM" AND
  
                            "TF"."TFFNH"="V"."FNNUM")
  
    77 - filter("X$KTSSO"."INST_ID"=USERENV('INSTANCE'))
  
    80 - filter("S"."INST_ID"=USERENV('INSTANCE') AND BITAND("S"."KSSPAFLG",1)<>0 AND
  
                            BITAND("S"."KSUSEFLG",1)<>0 AND "KTSSOSES"="S"."ADDR" AND "KTSSOSNO"="S"."KSUSESER" AND
  
                            "S"."INDX"="W"."KSLWTSID")
  
    81 - filter("W"."KSLWTEVT"="E"."INDX")
阅读全文 »

现象

数据库等待事件出现大量TM表锁,造成数据库严重等待。经过查询引起的SQL为简单的DELETE语句

1
DELETE FROM INSP.WF_XXX_XXX WHERE PROCESS_ID='8a80841663fb6dc00164d051ddd3240c';
阅读全文 »

概述

High-Water Mark,HWM是Segment的概念,如果我们把表想象成一张平面图在给表插入数据时由左至右开辟一系列块,高水位线就是曾经包含过数据的最右边的块,高水位线并不会随着数据的删除而降

阅读全文 »

pager

pager类似于Linux的管道符,可以把输出提供给另一个命令作为输入。pager可以衔接各种Linux命令,下面是几种常见的用法

查找正在运行的查询

1
2
3
root@(none) 14:44:  pager grep Query
PAGER set to 'grep Query'
root@(none) 14:44: show full processlist;
阅读全文 »

部分控制文件丢失

数据库默认会有两个控制文件存放在不同位置,如果其中一个文件丢失可以通过拷贝另一个控制文件进行恢复,这也是为什么要采用多路复用的原因。

停止数据库

1
SQL> shutdown immediate
阅读全文 »

RMAN参数

CONFIGURE RETENTION POLICY

保留7天的备份,超过7天标记为obsolete

1
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS
阅读全文 »

概述

FLASHBACK是在10g中推出的一个技术簇,其中主要包括:

  • Flashback Database
  • Flashback Drop
  • Flashback Table
  • Flashback Query
  • Flashback Version Query
  • Flashback Transaction Query
  • 11g的Total-Recall
阅读全文 »

概述

还原点(Restore Point)是10gR2推出的一个新特性,是与数据库时间戳或SCN关联的。还原点可以用于将表或数据库闪回到还原点指定的时间。还原点分为正常还原点和保证还原点两种类型

正常还原点

阅读全文 »

近日,突然收到数据库同步延迟告警短信,登陆数据库后发现一个从节点确实存在复制延迟情况,并且还在不断增长

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Queueing master event to the relay log
Master_Host: 10.0.139.161
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000228
Read_Master_Log_Pos: 930111496
Relay_Log_File: xxxx-relay-bin.000685
Relay_Log_Pos: 96105
Relay_Master_Log_File: mysql-bin.000228
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 930111496
Relay_Log_Space: 930112265
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 656
阅读全文 »

基于组提交的并行复制

在MySQL复制运行过程中,可能由于主从机器性能差异、大事务、大表DDL等原因导致主从复制延迟。并且由于SQL线程是单线程串行执行,当主节点写入压力较大时也非常容易造成复制延迟,针对这种情况,MySQL5.6提供了并行复制功能。其中把SQL线程分为coordinator_thread和worker,coordinator线程主要负责判断是否可并行执行,然后选择Worker线程执行事务的二进制日志,如果是DDL或是事务跨schema这种不可并行执行的,则等待worker线程执行完成后再执行当前日志。

阅读全文 »

异步复制

MySQL默认采用异步复制的模式,主节点提交事务后会立即返回客户端,从节点是否接收应用并不影响。在一个高可用的方案中,如果主节点发生Crash,集群发生切换,可能会造成事务数据丢失。其复制原理如下:

阅读全文 »

透明表空间传输能够使用物理复制的方式快速迁移一张表,通常用于数据表存在问题时,通过异机恢复后再以该方式将表快速恢复到生产环境中。

源表信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@test 15:56:  select * from c;
+---+------+
| a | b |
+---+------+
| 1 | lu |
| 2 | heng |
| 3 | xing |
+---+------+
3 rows in set (0.00 sec)

root@test 15:57: desc c;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| a | int | NO | PRI | NULL | auto_increment |
| b | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
阅读全文 »

PSYNC2

在2.8到4.0之间的版本中,Redis同步机制为PSYNC1,在4.0中升级为PSYNC2。其中主要优化减少了全量同步的操作。比如下列场景:

  1. 在之前的版本中,主节点重启导致run id发生变化,从而导致从节点获取同步状态信息错误,必须重新拉取主节点的全量数据,如果此时主节点数据量过大,将可能同步失败并带来消耗大量资源性能
    1
    2
    3
    4
    5
    6
    7
    8
    9
    32716: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
  2. PSYNC1因为网络中断或者阻塞导致主从中断,恢复后也需要从主节点重新同步一份全量数据。PSYNC2只需要同步延迟的数据
  3. 在进行链式复制,例如节点A->节点B->节点C架构,当节点A出现问题,C并不能正常同步B节点,当B节点作为主节点时,C节点需要全量同步一次B节点的数据,PSYNC2解决了这一问题。
  4. 在一主多从架构下,如果主节点故障,另一个节点提升为主节点,PYSYNC2只需要增量向新的主节点同步数据
阅读全文 »

mongoexport/mongoimport

mongoexport用于导出MongoDB实例中的数据,支持JSON和CSV格式。而mongoimport则提供相反的导入功能。Mongoexport/mongoimport采用严格模式表示。mongoexport需要对数据库进行读访问,因此连接用户至少要有数据库的read角色。mongoimport仅支持UTF-8编码的文件,且连接用户要有readwrite的数据库角色

阅读全文 »

数据库备份恢复是运维工作的重点,当发生数据丢失或异常,需要通过备份等手段恢复数据,保护数据安全。

备份类型分为三种:冷备、热备和温备,冷备即将数据库服务停止后对文件进行拷贝;热备即在线备份,备份过程中不影响业务正常运行;温备即对数据库全局加锁,禁止数据更新以达到备份一致性。

备份方式通常采用逻辑备份或物理备份,逻辑备份速度较慢,备份灵活,可针对实例、数据库、表、对象等进行备份,且不受版本影响;物理备份速度较快,备份不够灵活,跨版本之前可能存在兼容性问题。

制定备份策略应该综合考虑备份空间大小和恢复速度,全备周期短,空间使用就大;全备周期长,恢复起来就慢。

阅读全文 »

sysbench

sysbench是基于LuaJIT的可编写多线程基准工具,可用于数据库基准测试,了解系统及数据库的基础性能相关信息,项目地址:sysbench。sysbench包含以下基准测试:

  • oltp_*.lua:模拟OLTP下的数据库基准测试的集合
  • fileio:文件系统基准测试
  • cpu;简单的CPU基准测试
  • memory:内存访问基准测试
  • threads:基于线程的调度程序基准测试
  • mutex:POSIX互斥基准测试
阅读全文 »

聚合操作将多个文档中的值组合在一起并对数据进行各种操作以返回计算结果。MongoDB提供了三种执行聚合的方法:聚合管道、mapreduce、单用途聚合

聚合管道

通过多个构件来创建一个pipeline,用于对多个文档进行处理。这些构件包含了筛选(filtering)、投射(projecting)、分组(grouping)、排序(sorting)、限制(limiting)和跳过(skiping)

阅读全文 »

MySQL从5.7.6开始支持Rewrite plugin插件,可以将符合条件的SQL语句进行改写。

安装插件

1
2
3
4
5
6
7
8
9
[root@t-luhx03-v-szzb share]# mysql -uroot -p < /usr/local/mysql/share/install_rewriter.sql
Enter password:

root@test 09:45: SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| rewriter_enabled | ON |
+------------------+-------+
阅读全文 »

GridFS用于存储和检索超过16M的bson文档大小限制的文件,GridFS不会将文件存储在单个文档中,而是将文件分为多个部分或chunks,并将每个chunks存储为单独的文档。默认情况下,GridFS使用的默认块大小为255KB。

阅读全文 »

索引类似于书本中的目录索引页,能够快速查找数据。在无索引的情况下,查询总是遍历整个集合来查找相应的数据。在集合数据量比较大时,全部遍历的效率是低下的。如果创建合适的索引,将通过遍历索引数据来查找对应的文档。

阅读全文 »

Simple Nested-Loop Join

Simple Nested-Loop Join的算法简单粗暴,其通过驱动表中的每一条记录与被驱动表中的记录进行对比,假设有表A和表B,表A有10000条记录,表B有1000条记录,那数据对比的次数就等于10000*1000次,效率是非常低下的。

阅读全文 »

插入文档

插入一个或多个文档

1
2
3
4
5
6
7
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
阅读全文 »

Linux配置优化

内存配置

vm.overcommit_memory

Linux系统对内存请求都会分配,以便能运行更多程序。在申请内存后并不会马上使用内存,这种技术就叫做overcommit,如果参数设置为0则Redis会出现告警。

阅读全文 »

Database Profile

Database Profiler收集有关正在运行的数据库命令,包括CRUD操作以及配置和管理命令。Profiler将收集的数据写入admin数据库下的system.profile的固定集合。Database Profiler默认情况是OFF的,可以在数据库或实例上启用Profiler

阅读全文 »

用户

在MongoDB启用AUTH认证后,需要通过用户名/密码以及认证数据库去连接实例,因此需要提前创建好相应的用户

USER文档描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...]
serverAddress: ["<IP>" | "<CIDR range>", ...]
},
...
],
mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>", ... ],
passwordDigestor: "<server|client>"
}
阅读全文 »

数据库

MongoDB能够承载多个数据库,一个数据库可以包含0个或多个集合。每个数据库都有独立的权限,每个数据库也存放在不同文件上。MongoDB数据库通过名称来标识,数据库名可以是满足以下条件的任意UTF-8字符串:

阅读全文 »

Oracle数据库提供了一种机制,可以在不明显影响表的可用性情况下进行表结构更改。当表在线重定义时,在重定义过程中,可以对表进行查询或DML。该表仅在非常小的窗口期以独占模式被锁定,该窗口独立于表格的大小和重定义的复杂性,并且对用户完全透明。在线重定义表需要大量的空闲空间,大致为被重定义表的二倍空间,如果添加新列则需要更多的空间。

阅读全文 »

在实际查询应用中,往往需要对一个或多个字段进行排序,来保证结果集数据的有序性。当我们在执行计划的Extra出现了Using filesort的时候就表示语句需要排序,MySQL会给每个线程分配一块排序内存,由参数sort_buffer_size控制大小,如果sort buffer放不下,则需要通过临时文件来进行排序,通过OPTIMIZER_TRACE可以查看SQL是否使用临时文件进行排序

阅读全文 »

VM_CONCAT

vm_concat可以用来进行行转列,默认以逗号分隔,可通过vm_concat(name,’,’,’|’)修改为|

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> select * from test
id name
---- -----
1 a
2 b
1 c
2 d
        
SQL> select id,wm_concat(name) from test group by id
id name
---- ------
1 a,c
2 b,d
阅读全文 »

Redis Cluster是Redis提供的分布式解决方案,有效地解决了Redis单机内存、并发、流量等瓶颈限制,实现数据负载均衡。

Redis数据分区

Redis Cluster采用哈希分区规则,常见的哈希分区规则有以下三种:

阅读全文 »

分区类型

范围分区(RANGE)

范围分区是将数据按范围映射到每一个分区里去,分区范围是在创建分区时指定的,例如经常使用的时间分区,把数据表按月分区。

1
2
3
4
5
6
7
8
9
10
11
create table partition_tab
(
PID NUMBER NOT NULL PRIMARY KEY,
DATE_TIME DATE
)
PARTITION BY RANGE (DATE_TIME)
(
PARTITION P2001 VALUES LESS THAN (TO_DATE('2020-02-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) TABLESPACE USERS,
PARTITION P2002 VALUES LESS THAN (TO_DATE('2020-03-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) TABLESPACE USERS,
PARTITION PMAX VALUES LESS THAN (MAXVALUE) TABLESPACE USERS
)
阅读全文 »

Twemproxy又叫nutcraker,是一个由Twitter开源的memcache、Redis协议的轻量级代理。Twemproxy通过引入一个代理层,可以将其后端的多台redis或memcached实例进行统一管理与分配,使应用程序只需要在Twemproxy 上进行操作,而不用关系后面具体有多少个真实的redis或memcached存储。

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官方推荐的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中,针对不同的类型的子查询,优化器选择的优化策略也不同。对于IN、=ANY类子查询,优化器会选择如下策略:

  • semijoin
  • Materialization
  • exists

对于NOT IN、<>ALL类子查询,优化器会选择如下策略:

阅读全文 »

内存分析

通常我们可以通过执行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
阅读全文 »

执行计划是在SQL性能优化时关注的重点,通过执行计划我们能够知道MySQL如何处理SQL,分析性能瓶颈并作出相应优化。

1
2
3
4
5
6
root@employees 11:40:  explain select * from titles where emp_no=10001;
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | titles | NULL | ref | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+-------+
阅读全文 »

客户端通信协议

redis客户端和服务端通信协议建立在TCP基础上,并且制定了RESP(Redis Serialization Protocal)序列化协议。其格式大致如下:

1
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
阅读全文 »

Redis3.2支持GEO(地理信息定位)功能,能够存储地理位置信息来实现附近的位置等依赖于地理位置信息的功能。

添加地理位置

1
geoadd key longitude latitude member

longitude、latitude、member分别是地理位置的经度、维度、成员。如果需要更新地理位置信息也可以使用geoadd命令。

阅读全文 »

假设表存在N行数据,每个索引节点平均有M个索引key,这时候索引的树高度则为logN/logM。由于索引页大小固定,KEY越小,M值就会越大,索引高度就越小,遍历树的效率就更高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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';
+----------+---------------------+------+--------+-------+-------------+------------+---------------+------------+----------+---------+----------+------+----------+---------+-------+-----------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE | INDEX_ID | NAME | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE | MERGE_THRESHOLD |
+----------+---------------------+------+--------+-------+-------------+------------+---------------+------------+----------+---------+----------+------+----------+---------+-------+-----------------+
| 50 | employees/employees | 41 | 9 | 37 | Barracuda | Compressed | 8192 | Single | 57 | PRIMARY | 50 | 3 | 1 | 3 | 37 | 50 |
+----------+---------------------+------+--------+-------+-------------+------------+---------------+------------+----------+---------+----------+------+----------+---------+-------+-----------------+

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/titles';
+----------+------------------+------+--------+-------+-------------+------------+---------------+------------+----------+----------+----------+------+----------+---------+-------+-----------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE | INDEX_ID | NAME | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE | MERGE_THRESHOLD |
+----------+------------------+------+--------+-------+-------------+------------+---------------+------------+----------+----------+----------+------+----------+---------+-------+-----------------+
| 62 | employees/titles | 33 | 7 | 49 | Barracuda | Dynamic | 0 | Single | 73 | PRIMARY | 62 | 3 | 3 | 3 | 49 | 50 |
| 62 | employees/titles | 33 | 7 | 49 | Barracuda | Dynamic | 0 | Single | 74 | idx_date | 62 | 0 | 1 | 12 | 49 | 50 |
+----------+------------------+------+--------+-------+-------------+------------+---------------+------------+----------+----------+----------+------+----------+---------+-------+-----------------+
阅读全文 »

发布与订阅

除了可以使用List(列表)来实现消息队列,Redis也提供了发布订阅功能,可用于消息的传递。Redis的发布订阅包括三个部分:发布者、订阅者、频道(Channel)。发布者推送消息至频道,订阅了该频道的订阅者都可以接收到该消息。其中发布者和订阅者都为客户端,Channel为服务端。

阅读全文 »

事务

Redis提供了简单的事务功能以及Lua脚本,来保障多个命令组合的原子性,也就是ACID中的A(Atomictiy)。Redis事务由multi命令显示开启,并以exec结束事务。Redis事务不支持回滚特性,使用过程中需要多注意。

阅读全文 »

MySQL索引

索引用于提高查询效率,常见的索引数据结构有:哈希表、有序数组和搜索树。

  • 哈希表以key-value形式存储,通过哈希函数查找key的位置获取对应value值。存储的数据是无序的,因此在做范围查询时需要全表扫描,性能很差
  • 有序数组是按顺序排列的,通过二分法能快速查询到对应数据,包括范围查询。但更新效率太低,往中间插入新数据时需要挪动后面的所有记录。适用于静态只读数据
  • 二叉树的特点在于每个节点的左儿子小于父节点,右儿子大于父节点,通过树搜索效率很高。但二叉树索引不止存在于内存,也存在于磁盘上,如果二叉树树高太深,也需要遍历多次磁盘,效率大打折扣。因此更多数据库系统都采用N叉树或B+树,减少磁盘遍历次数。
阅读全文 »

Redis支持RDB和AOF两种持久化机制,持久化能够避免因进程退出而造成的数据丢失,在进程下一次启动时自动加载持久化文件中的数据。持久化通常用于备份恢复的场景,利用持久化文件进行数据迁移。

RDB持久化

阅读全文 »

MySQL临时表是一种特殊的数据对象,它具有以下几个特点:

  • 临时表只能被创建它的会话访问,对其他线程不可见
  • 临时表可以用普通表重名,操作默认都是针对临时表
  • show tables是无法看见临时表的
  • 当会话结束后,自动删除临时表
阅读全文 »

键重命名

1
rename key newkey

如果在重命名之前新的键名已经存在将会对其值进行覆盖,为了防止被强制rename,可以使用renamenx命令,确保只有新的key不存在时才会覆盖。
在rename的时候还有以下两点需要注意:

阅读全文 »

当前业务出现死锁情况,其操作流程为批量DELETE再批量INSERT,经过排查发现是由于二级唯一索引在DELETE之后未完全被purge回收,再批量插入时互相等待造成的死锁。这里需要说明的是,当记录被DELETE删除后该行记录会被标识为DELETE_MARK状态,此时并没有真正地被回收,只有等purge线程回收后才是真正意义的被删除。

阅读全文 »

Redis有5种基础数据结构,分别为:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。所有数据结构都是key-value形式,通过唯一key来获取对应的value值,不同数据结构的差异在于value结构不同。

阅读全文 »

在针对存在唯一索引的表中并发插入数据时,可能会触发死锁问题,今天我们就一起来探讨该死锁产生的原因。先准备测试案例,创建带有唯一索引的表A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> desc a;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> select * from a;
+------+
| id |
+------+
| 1 |
| 5 |
+------+
阅读全文 »

系统配置

vm.overcommit_memory

Linux系统对内存请求都会分配,以便能运行更多程序。在申请内存后并不会马上使用内存,这种技术就叫做overcommit,如果参数设置为0则Redis会出现告警。

1
WARNING overcommit_memory is set 0!

该参数有三个值可选,Redis建议设置为1并配合maxmemory使用

阅读全文 »

事务

ACID

ACID即事务的四种特性:

  • 原子性(Atomicity):事务中的操作要么全部成功(commit),要么全部失败(rollback)
  • 一致性(Consistency):数据库总是从一个一致性状态切换到另一个一致性状态
  • 隔离性(Isolation):一个事务所做的修改对其它事务不可见,好似串行执行
  • 持久性(Durability):事务提交后持久化到数据库磁盘中保存
阅读全文 »

参数文件

当MySQL实例启动时,数据库会读取参数文件,查找参数文件的顺序为/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf,相同的参数会以最后读到的参数文件为准。当参数文件不存在时,NySQL所有的参数值就取决于编译MySQL时指定的值和源代码指定参数的默认值。参数由key-value类型的键值对组成,我们可以通过show variables或information_schema.GLOBAL_VARIABLES视图来查看。

阅读全文 »

table compress
MySQL在5.1的INNODB中引入了压缩功能,通过压缩功能,能够更加充分的使用硬件,减少IO压力。早期引入的table compress默认采用zlib的压缩算法,针对page数据页进行压缩,可以指定压缩块大小。开启表压缩需要启用innodb_file_per_table独立表空间参数,innodb_file_format需要为Barracuda。

阅读全文 »

数据页结构

页是InnoDB数据存储的最小单位,页类型为B-tree Node的页存放的就是表中行的实际数据。数据页由7个部分组成:

  • File Header
  • Page Header
  • Infimum和Supremum Record
  • User Records
  • Free Space
  • Page Directory
  • File Trailer
阅读全文 »

MySQL基本上可以分为Server层和引擎层。Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖了MySQL的大部分核心服务以及所有的内置函数;存储引擎层负责数据的存储和提取,其架构为插件形式,支持Innodb、MyISAM、Memory等多种存储引擎,目前OLTP系统大多数采用InnoDB,从MySQL5.5开始便作为默认存储引擎存在。

阅读全文 »

概述

MySQL Group Replication(MGR)是MySQL 5.7引进的高可用扩展,以插件形式提供。MGR具有以下特点:
高一致性:MGR基于分布式paxos协议实现组复制,确保数据一致性。
高可用性:提供了故障检测及故障切换,只要超半数节点存活即可正常工作
高扩展性:MGR能够自由添加或删除节点,加入节点后自动同步数据
高灵活性:MGR支持单主和多主模式,可以来回自动切换模式

阅读全文 »

数据库安装

编辑响应文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
;SQL Server 2014 Configuration File
[OPTIONS]

; 操作类型(INSTALL、UNINSTALL 或 UPGRADE)

ACTION="Install"

; 是否安装英文版

ENU="False"

; 指定产品密钥,若未指定则使用Evaluation

PID="27HMJ-GH7P9-X2TTB-WPHQC-XXXXX"

; 接受许可条款

IACCEPTSQLSERVERLICENSETERMS

; 安装是否采用静默安装不出现用户界面

QUIET="False"

; 安装程序将只显示进度,而不需要任何用户交互。

QUIETSIMPLE="true"

; 指定 SQL Server 安装程序是否应发现和包括产品更新。有效值是 True 和 False 或者 1 和 0。默认情况下,SQL Server 安装程序将包括找到的更新。

UpdateEnabled="False"

; 指定是否可将错误报告给 Microsoft 以便改进以后的 SQL Server 版本。指定 1 或 True 将启用此功能,指定 0 或 False 将禁用此功能。

ERRORREPORTING="False"

; 如果提供了此参数,则此计算机将使用 Microsoft Update 检查更新。

USEMICROSOFTUPDATE="False"

; 指定要安装、卸载或升级的功能。顶级功能列表包括 SQL、AS、RS、IS、MDS 和工具。SQL 功能将安装数据库引擎、复制、全文和 Data Quality Services (DQS)服务器。工具功能将安装管理工具、联机丛书组件、SQL Server Data Tools 和其他共享组件。

FEATURES=SQLENGINE,REPLICATION,FULLTEXT,DQ,DQC,CONN,BC,SDK,BOL,SSMS,ADV_SSMS

; 指定 SQL Server 安装程序将获取产品更新的位置。有效值为 "MU" (以便搜索产品更新)、有效文件夹路径以及 .\MyUpdates 或 UNC 共享目录之类的相对路径。默认情况下,SQL Server 安装程序将通过 Window Server Update Services 搜索 Microsoft Update 或 Windows Update 服务。

UpdateSource="MU"

; 显示命令行参数用法

HELP="False"

; 指定应将详细的安装程序日志传送到控制台。

INDICATEPROGRESS="False"

; 指定安装程序应该安装到 WOW64 中。IA64 或 32 位系统不支持此命令行参数。

X86="False"

; 指定共享组件的安装根目录。在已安装共享组件后,此目录保持不变。

INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server"

; 指定 WOW64 共享组件的安装根目录。在已安装 WOW64 共享组件后,此目录保持不变。

INSTALLSHAREDWOWDIR="C:\Program Files (x86)\Microsoft SQL Server"

; 指定默认实例或命名实例。安装 SQL Server 数据库引擎(SQL)、Analysis Services (AS)或 Reporting Services (RS)时,此参数是必需的。

INSTANCENAME="MSSQLSERVER"

; 指定可以收集 SQL Server 功能使用情况数据,并将数据发送到 Microsoft。指定 1 或 True 将启用此功能,指定 0 或 False 将禁用此功能。

SQMREPORTING="False"

; 为您已指定的 SQL Server 功能指定实例 ID。SQL Server 目录结构、注册表结构和服务名称将包含 SQL Server 实例的实例 ID。

INSTANCEID="MSSQLSERVER"

; 指定安装目录。

INSTANCEDIR="C:\Program Files\Microsoft SQL Server"

; SQL Server 服务的启动类型。

SQLSVCSTARTUPTYPE="Automatic"

; SQL Agent代理服务的启动类型

AGTSVCSTARTUPTYPE="Automatic"

; Browser 服务的启动类型。

BROWSERSVCSTARTUPTYPE="Disabled"

; CM 程序块 TCP 通信端口

COMMFABRICPORT="0"

; 矩阵如何使用专用网络

COMMFABRICNETWORKLEVEL="0"

; 如何保护程序块间的通信

COMMFABRICENCRYPTION="0"

; CM 程序块使用的 TCP 端口

MATRIXCMBRICKCOMMPORT="0"

; 指定要用于数据库引擎的 Windows 排序规则或 SQL 排序规则。

SQLCOLLATION="Chinese_PRC_CI_AS"

; 要设置为 SQL Server 系统管理员的 Windows 帐户。

SQLSYSADMINACCOUNTS="VANKE\s-sql"

; 默认值为 Windows 身份验证。使用 "SQL" 表示采用混合模式身份验证。

SECURITYMODE="SQL"

; 指定 0 禁用 TCP/IP 协议,指定 1 则启用该协议。

TCPENABLED="1"

; 指定 0 禁用 Named Pipes 协议,指定 1 则启用该协议。

NPENABLED="0"

; Add description of input argument FTSVCACCOUNT

FTSVCACCOUNT="NT Service\MSSQLFDLauncher"
阅读全文 »

Orchestrator是GO编写的MySQL高可用性和复制拓扑管理工具,支持复制拓扑结构的调整,自动故障转移和手动主从切换等。提供Web界面展示MySQL复制的拓扑关系及状态,也可以在Web上更改MySQL的复制关系和部分配置信息,同时也提供命令行和api接口,方便运维管理。相比较MHA来看最重要的是解决了管理节点的单点问题,其通过raft协议保证本身的高可用

阅读全文 »

概述

在大表中做批量更新或删除时往往会很慢,在操作过程中还需要额外去维护索引,无疑会使得其更慢。如果是分区表还能通过加并行或truncate分区来加速操作,但是如果是普通表的话的就不太好去优化了,nologging和parallel也没有明显的效果。

阅读全文 »

group by rollup(a,b)

说明:先做一次a和b的分组,再做一次a的分组,最后做一次no group

示例:统计公司每个部门的部门编号和总薪水,以及公司的总薪水

1
2
3
4
5
6
7
8
9
SQL> select deptno,sum(sal) from emp group by rollup(deptno);
  
DEPTNO SUM(SAL)
---------- ----------
    10 8750
    20 10875
    25 10000
    30 9400
            39025 ---公司总薪水
阅读全文 »

概述

Model子句为SQL计算带来了新的能力和灵活性,使用Model子句可以根据查询结果创建多维数组,然后将公式(rules)应用与数组以计算新值。Model子句可以取代电子表格进行SQL建模,数据仓库中使用较多

阅读全文 »

语法

Hierarchical Queries

  • START WITH:指定层次结构中的根行
  • CONNECT BY:指定父级和子级之间的关系。
    • NOCYCLE参数指示Oracle数据库查询中返回行,即使CONNECT BY 数据中存在循环也是如此。将此参数与CONNECT_BY_ISCYCLE伪列一起使用可以参看哪些行包括循环
    • 在分层查询中,condition必须使用PRIOR运算符限定一个表达式以引用父行。PRIOR和+或-的优先级一致。PRIOR表达式不能引用序列
阅读全文 »

OGG-01163

错误内容

1
2
ERROR OGG-01163  Bad column length (466) specified for column DBRANGE in table 
GCLOUD_DC.HT_DCDY_JBXX_ZS, maximum allowable length is 400.
阅读全文 »

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检查和告警的频率
阅读全文 »

同步表添加附加日志

1
GGSCI>add trandata test.tab2

抽取进程和投递进程参数添加同步表

1
2
3
4
GGSCI>edit params EXTEST01
Table test.tab2;
GGSCI>edit params PUTEST01
Table test.tab2;
阅读全文 »

安装OGG软件

选择数据库版本
ogg_install01

指定安装路径以及数据库路径
ogg_install02

数据库配置

开启强制日志、附加日志、并确定处于归档模式

1
2
3
SQL> ALTER DATABASE FORCE LOGGING;  
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL> alter system set enable_goldengate_replication=true;
阅读全文 »

安装OGG软件

选择数据库版本
ogg_install01

指定安装路径以及数据库路径
ogg_install02

OGG FOR SQL Server Download
View Password:j6mh

数据库配置

开启强制日志、附加日志、并确定处于归档模式

1
2
3
SQL> ALTER DATABASE FORCE LOGGING;  
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL> alter system set enable_goldengate_replication=true;
阅读全文 »

安装OGG软件

选择数据库版本
ogg_install01

指定安装路径以及数据库路径
ogg_install02

数据库配置

开启强制日志、附加日志、并确定处于归档模式

1
2
3
SQL> ALTER DATABASE FORCE LOGGING;  
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL> alter system set enable_goldengate_replication=true;
阅读全文 »

查看数据库信息

1
2
3
4
5
6
7
8
9
SQL> select DBID,NAME,LOG_MODE,PLATFORM_NAME,CURRENT_SCN,DB_UNIQUE_NAME from v$database;
            DBID NAME LOG_MODE PLATFORM_NAME CURRENT_SCN DB_UNIQUE_NAME
---------- --------- ------------ ------------------------------ ----------- ---------
3079346487 OGG ARCHIVELOG Linux x86 64-bit 1128003 ogg
  
SQL> select INSTANCE_NAME,HOST_NAME,VERSION,DATABASE_STATUS from v$instance;
INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION DATABASE_STATUS
---------------- ------------------------------ ------------ ---------------
1 ogg OGG 11.2.0.3.0 ACTIVE
阅读全文 »

系统配置

内存要求

查看系统内存

1
$ grep Memtotal /proc/meminfo

查看Swap

1
$ grep SwapTotal /proc/meminfo

内存要求不低于1G,且swap需根据memory设置

阅读全文 »

ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana

阅读全文 »

系统优化配置

Limit配置

1
2
3
4
5
$ cat /etc/security/limits.conf
* soft nofile 64000
* hard nofile 64000
* soft nproc 64000
* hard nproc 64000
阅读全文 »

MySQL安装配置

略。请参考MySQL相关文章

创建zabbix数据库

1
2
3
4
5
6
7
sql> create database zabbix character set utf8 collate utf8_bin;
sql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
sql> flush privileges;
sql> use zabbix
sql> source /soft/zabbix-3.4.9/database/mysql/schema.sql
sql> source /soft/zabbix-3.4.9/database/mysql/images.sql
sql> source /soft/zabbix-3.4.9/database/mysql/data.sql
阅读全文 »

下载离线安装包

Download
将文件重命名为NetFx3.cab并放入C:\windows下

powershell执行安装

1
dism /online /Enable-Feature /all /FeatureName:NetFx3 /Source:"%windir%" /LimitAccess

安装依赖

1
# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++ -y
阅读全文 »

创建逻辑卷

创建pv

1
2
[root@t-pcportal-a-szzb ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
阅读全文 »

Top

top命令可以实时的动态的查看系统整体的运行状况,提供了CPU、内存、进程等资源信息。

参数选项

  • -b:以批处理模式操作
  • -c:显示完整的命令
  • -d:刷新间隔时间
  • -I:忽略失效进程
  • -s:保密模式
  • -S:累积模式
  • -i<time>:设置间隔时间
  • -u<user>:指定用户名
  • -p<process>:指定进程
  • -n<number>:循环显示的次数
阅读全文 »

Hugepages概述

HugePages是集成到Linux2.6内核版本中的一项功能,启用HugePages可以让操作系统支持大于默认值(4K)的内存页面。使用大内存页可以减少访问页表所需的系统资源量来提高系统性能。HugePages支持32位或者64位,大小从2M到256M不等。对于Oracle数据库,使用HugePages可以减少操作系统对内存页状态的维护,并增加Translation Lookaside Buffer (TLB) 的命中率。

阅读全文 »

升级前的准备

查看当前openssh版本

1
2
[root@localhost ~]# ssh -V    
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

上传新版本openssh

阅读全文 »