mysql磁盘存储

Mysql磁盘存储

Mysql 的数据的访问和持久化都需要磁盘来当作存储工具

frm、ibd文件

在mysql中当我们创建表的时候,mysql可以帮助创建一个 .frm 文件和 .ibd 文件。 其中 .frm 文件是描述表结构定义的文件,而 .ibd 文件是 Innodb 引擎特有的,用于记录 Innodb 表的数据。
一般这两个文件存在于Mysql的data目录下。而且文件名就是创建的表名。

Innodb的文件存储格式和行存储格式

Innodb中的表是分文件存储的,表中的数据都是按照一定的格式存储在文件中的。
Innodb的文件格式由参数 innodb_file_format 指定。可以使用 show variables like 'innodb_file_format'; 查看
Antelope文件格式是较早的,它支持的行存储格式为:Compact、Redundant
Barracuda 是新的文件存储格式,它兼容Antelope,它支持的行存储格式:Compressed、Dynamic

Innodb表的行存储格式由参数 innodb_default_row_format 指定,行存储格式表明了表中的每行数据是如何存储在文件中的,不同存储格式有不同的优缺点,也适合不同的场景,也会决定数据库的使用性能。
例如,使用 Compressed 这种格式可以使行记录有更高的压缩比,如果一个物理页能存放的行记录越多,它的索引或记录查找会更快,内存消耗也会更小,但是压缩数据本身也会带回额外的系统开销。

注意一点,在迁移数据库的时候,需要关注源实例和目标实例之间行存储格式是否匹配。比如你有一个 MyISAM 的表要迁移到 InnoDB 上,并且 MyISAM 表的 Row Format 为默认值 Fixed ,此时需要改成 Dynamic ,因为这两种格式对变长字段如 varchar/blob/text 等的处理是不一致的。

查看更多

Mysql show slave status

show slave status\G 参数介绍

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
Slave_IO_State: Waiting for master to send event  等待 master 发生事件
Master_Host: 10.173.1.203            当前的主服务器主机
Master_User: backup        被用于连接主服务器的当前用户
Master_Port: 3306          当前的主服务器接口
Connect_Retry: 60            选项的当前值
Master_Log_File: mysql-bin.000010    SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称
Read_Master_Log_Pos: 188793146        在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置
Relay_Log_File: mysql-relay-bin.000002  SQL线程当前正在读取和执行的中继日志文件的名称
Relay_Log_Pos: 186655308      在当前的中继日志中,SQL线程已读取和执行的位置
Relay_Master_Log_File: mysql-bin.000010  由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
Slave_IO_Running: Yes        I/O线程是否被启动并成功地连接到主服务器上
Slave_SQL_Running: Yes        SQL线程是否被启动
Replicate_Do_DB:          replicate-do-db选项的当前值
Replicate_Ignore_DB: mysql        replicate-ignore-db选项的当前值
Replicate_Do_Table:          replicate-do-table选项的当前值
Replicate_Ignore_Table:          replicate-ignore-table选项的当前值
Replicate_Wild_Do_Table:          replicate-wild-do-table选项的当前值
Replicate_Wild_Ignore_Table:          replicate-wild-ignore_table选项的当前值
Last_Errno: 0          最近一次错误码
Last_Error:          最近一次错误内容 
Skip_Counter: 0          最近被使用的用于SQL_SLAVE_SKIP_COUNTER的值
Exec_Master_Log_Pos: 188793146      来自主服务器的二进制日志的由SQL线程执行的上一个时间的位置(Relay_Master_Log_File)。在主服务器的二进制日志中的(Relay_Master_Log_File,Exec_Master_Log_Pos)对应于在中继日志中(Relay_Log_File,Relay_Log_Pos) 
Relay_Log_Space: 186655464  所有原有的中继日志结合起来的总大小
Until_Condition: None    如果没有指定UNTIL子句,则没有值。如果从属服务器正在读取,直到达到主服务器的二进制日志的给定位置为止,则值为Master。如果从属服务器正在读取,直到达到其中继日志的给定位置为止,则值为Relay
Until_Log_File:      用于指示日志文件名,日志文件名和位置值定义了SQL线程在哪个点中止执行
Until_Log_Pos: 0      用于指示日志位置值,日志文件名和位置值定义了SQL线程在哪个点中止执行
Master_SSL_Allowed: No      如果允许对主服务器进行SSL连接,则值为Yes。如果不允许对主服务器进行SSL连接,则值为No。如果允许SSL连接,但是从属服务器没有让SSL支持被启用,则值为Ignored。
Master_SSL_CA_File:        master-ca选项的当前值
Master_SSL_CA_Path:        master-capath选项的当前值
Master_SSL_Cert:        master-cert选项的当前值
Master_SSL_Cipher:        master-cipher选项的当前值
Master_SSL_Key:        master-key选项的当前值
Seconds_Behind_Master: 0      本字段是从属服务器“落后”多少的一个指示。当从属SQL线程正在运行时(处理更新),本字段为在主服务器上由此线程执行的最近的一个事件的时间标记开始,已经过的秒数。当此线程被从属服务器I/O线程赶上,并进入闲置状态,等待来自I/O线程的更多的事件时,本字段为零。总之,本字段测量从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。如果主服务器和从属服务器之间的网络连接较快,则从属服务器I/O线程会非常接近主服务器,所以本字段能够十分近似地指示,从属服务器SQL线程比主服务器落后多少。如果网络较慢,则这种指示不准确;从属SQL线程经常会赶上读取速度较慢地从属服务器I/O线程,因此,Seconds_Behind_Master经常显示值为0。即使I/O线程落后于主服务器时,也是如此。换句话说,本列只对速度快的网络有用。即使主服务器和从属服务器不具有相同的时钟,时间差计算也会起作用(当从属服务器I/O线程启动时,计算时间差。并假定从此时以后,时间差保持不变)。如果从属SQL线程不运行,或者如果从属服务器I/O线程不运行或未与主服务器连接,则Seconds_Behind_Master为NULL(意义为“未知”)。举例说明,如果在重新连接之前,从属服务器I/O线程休眠了master-connect-retry秒,则显示NULL,因为从属服务器不知道主服务器正在做什么,也不能有把握地说落后多少。本字段有一个限制。时间标记通过复制被保留,这意味着,如果一个主服务器M1本身是一个从属服务器M0,则来自M1的binlog的任何事件(通过复制来自M0的binlog的事件而产生),与原事件具有相同的时间标记。这可以使MySQL成功地复制TIMESTAMP。但是,Seconds_Behind_Master的缺点是,如果M1也收到来自客户端的直接更新,则值会随机变化,因为有时最近的M1时间来自M0,有时来自直接更新,最近的时间标记也是如此。
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1      主服务器的server-ID值

Mysql show processlist 详解

Mysql show processlist 详解

show processlist 命令

show processlist 是显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。除非单独给这个用户赋予了PROCESS 权限。

show processlist 显示的信息都是来自MySQL系统库 information_schema 中的 processlist 表。所以使用下面的查询语句可以获得相同的结果:select * from information_schema.processlist;

如下是执行命令的结果:

1
2
3
4
5
6
mysql> show processlist;
+--------+------+-----------+--------------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+-----------+--------------------+---------+------+-------+------------------+
| 458492 | root | localhost | information_schema | Query | 0 | init | show processlist |
+--------+------+-----------+--------------------+---------+------+-------+------------------+

查看更多

go语言解码未知结构的JSON数据

go语言解码未知结构的JSON数据

http://c.biancheng.net/view/4524.html

在前面介绍接口的时候,我们提到基于Go语言的面向对象特性,可以通过空接口来表示任何类型,这同样也适用于对未知结构的 JSON 数据进行解码,只需要将这段 JSON 数据解码输出到一个空接口即可。

在实际解码过程中,JSON 结构里边的数据元素将做如下类型转换:

布尔值将会转换为Go语言的 bool 类型;

数值会被转换为Go语言的 float64 类型;

查看更多

go语言ini文件的操作

ini包使用

下载安装

1
2
3
4
特定版本
go get gopkg.in/ini.v1
最新版
go get github.com/go-ini/ini

数据源加载

1
2
3
4
5
6
一个 数据源 可以是 []byte 类型的原始数据,或 string 类型的文件路径。您可以加载 任意多个 数据源。如果您传递其它类型的数据源,则会直接返回错误。
cfg, err := ini.Load([]byte("raw data"), "filename")
或者从一个空白的文件开始:
cfg := ini.Empty()
当您在一开始无法决定需要加载哪些数据源时,仍可以使用 Append() 在需要的时候加载它们。
err := cfg.Append("other file", []byte("other raw data"))

操作分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
获取指定分区
section,err := cfg.GetSection("section name")

如果想要获取默认分区,则可以使用空字符串代替分区名
section,err := cfg.GetSection("")

当您确定某个分区是存在的,可以使用简单的办法
section := cfg.Section("")
如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。

创建一个分区:
err := cfg.NewSection("new section")

获取所有分区对象或名称
sections := cfg.Sections()
names := cfg.SectionStrings()

查看更多

go语言日志

Go日志

一、log包

log日志包会默认为输出带上时间,我们也可以自定义我们的日志抬头信息

1
2
3
4
// 定义抬头信息为:时间+文件名+源代码所在行号
func init(){
log.SetFlags(log.Ldate | log.Lshortfile)
}

log包提供的可定义的选项常量

1
2
3
4
5
6
7
8
9
const (
Ldate = 1 << iota //日期示例: 2009/01/23
Ltime //时间示例: 01:23:23
Lmicroseconds //毫秒示例: 01:23:23.123123.
Llongfile //绝对路径和行号: /a/b/c/d.go:23
Lshortfile //文件和行号: d.go:23.
LUTC //日期时间转为0时区的
LstdFlags = Ldate | Ltime //Go提供的标准抬头信息
)

查看更多