一、数据库和数据库实例的概念

在数据库领域中有2个词很容易混淆——数据库(database)和实例(instance)

1、数据库

物理操作系统文件或其他形式文件类型的集合。在MySQL数据库中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放于内存之中的文件,但是定义仍然不变。

2、数据库实例

MySQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。

3、数据库与实例之间的关系

在MySQL数据库中,实例与数据库的关系通常是一一对应的,即一个实例对应一个数据库,一个数据库对应一个实例。在集群情况下可能存在一个数据库被多个数据实例使用的情况。

MySQL数据库实例在系统上的表现就是一个进程。在Linux操作系统中通过以下命令启动MySQL数据库实例,并通过命令ps观察MySQL数据库启动后的进程情况:[root@multi_instance ~]# systemctl start mysqld

[root@multi_instance ~]# systemctl status mysqld

● mysqld.service - MySQL Server 3306

Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)

Active: active (running) since Tue 2018-09-18 02:25:21 EDT; 10s ago

Docs: man:mysqld(8)

https://dev.mysql.com/doc/refman/8.0/en/using-systemd.html

Main PID: 2201 (mysqld)

CGroup: /system.slice/mysqld.service

└─2201 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --pid-file=/data/mysql/mysql...

Sep 18 02:25:21 multi_instance systemd[1]: Started MySQL Server 3306.

Sep 18 02:25:21 multi_instance systemd[1]: Starting MySQL Server 3306...

[root@multi_instance ~]# ps aux | grep mysql

mysql 2201 5.5 7.0 1754304 131132 ? Ssl 02:25 0:01 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --pid-file=/data/mysql/mysql.pid

root 2231 0.0 0.0 112704 968 pts/0 S+ 02:25 0:00 grep --color=auto mysql

4、数据库实例的启动

MySQL数据库中,可以没有配置文件,在这种情况下,MySQL会按照编译时的默认参数设置启动实例。[root@multi_instance ~]# mysql --help | grep my.cnf

order of preference, my.cnf, $MYSQL_TCP_PORT,

/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

通过上面的命令可以看到,MySQL数据库是按“/etc/my.cnf→/etc/mysql/my.cnf→/usr/local/mysql/etc/my.cnf→~/.my.cnf”的顺序读取配置文件的。

问题1:如果几个配置文件中都有同一个参数,MySQL数据库以哪个配置文件为主?

答:MySQL数据库会以读取到的最后一个配置文件中的参数为准。

问题2:如果配置文件不在上述路径下或配置文件的名字不是my.cnf,此时该如何处理?

二、MySQL体系结构

再来回忆下数据库与数据库实例的理解。

数据库是由一个个文件组成(一般来说都是二进制的文件)的,要对这些文件执行诸如select、insert、update和delete之类的数据库操作是不能通过简单的操作文件来更改数据库的内容,需要通过数据库实例来完成对数据库的操作。

1、MySQL数据库体系结构单进程多线程

like Microfote SQL Server

Oracle多进程架构(except Windows)

插件式存储引擎架构

Like Linux file system。一个表是一个分区,引擎就是分区的文件系统

存储引擎的对象是表

show tables status:可以看到每个表对应的是哪个存储引擎

重点学习与了解的存储引擎为InnoDB

2、MySQL数据库体系结构图

从上图可以发现,MySQL由以下几部分组成:连接池组件

管理服务和工具组件

SQL接口组件

查询分析器组件

优化器组件

缓冲(Cache)组件

插件式存储引擎

物理文件

从中还可以发现,MySQL数据库区别于其它数据库的最重要的一个特点就是插件式的表存储引擎。

特别需要注意,存储引擎是基于表的,而不是数据库。

3、MySQL逻辑存储结构

MySQL Instance → Database → Schema → Table → View...

注意:一个Database对应一个Schema:

'create database aa;'等同于'create schema aa;'

'drop database aa;'等同于' drop schema aa;'

4、MySQL物理存储结构

(1)数据文件的路径

参数:datadirmysql> show variables like 'datadir';

+---------------+--------------+

| Variable_name | Value |

+---------------+--------------+

| datadir | /data/mysql/ |

+---------------+--------------+

(2)一个Database对应一个文件夹mysql> create database aa;

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| aa |

| mysql |

| performance_schema |

| sys |

+--------------------+

[root@multi_instance ~]# ls -lh /data/mysql

total 121M

drwxr-x---. 2 mysql mysql 20 Sep 18 03:27 aa -- 文件夹

-rw-r-----. 1 mysql mysql 56 Sep 2 07:14 auto.cnf

-rw-------. 1 root root 1.7K Sep 2 07:15 ca-key.pem

-rw-r--r--. 1 root root 1.1K Sep 2 07:15 ca.pem

-rw-r--r--. 1 root root 1.1K Sep 2 07:15 client-cert.pem

-rw-------. 1 root root 1.7K Sep 2 07:15 client-key.pem

-rw-r-----. 1 mysql mysql 13K Sep 18 02:25 error.log

-rw-r-----. 1 mysql mysql 361 Sep 2 07:22 ib_buffer_pool

-rw-r-----. 1 mysql mysql 12M Sep 18 02:25 ibdata1

-rw-r-----. 1 mysql mysql 48M Sep 18 02:25 ib_logfile0

-rw-r-----. 1 mysql mysql 48M Sep 2 07:14 ib_logfile1

-rw-r-----. 1 mysql mysql 12M Sep 18 02:25 ibtmp1

drwxr-x---. 2 mysql mysql 4.0K Sep 2 07:14 mysql -- 文件夹

-rw-r-----. 1 mysql mysql 5 Sep 18 02:25 mysql.pid

drwxr-x---. 2 mysql mysql 8.0K Sep 2 07:14 performance_schema -- 文件夹

-rw-------. 1 root root 1.7K Sep 2 07:15 private_key.pem

-rw-r--r--. 1 root root 451 Sep 2 07:15 public_key.pem

-rw-r--r--. 1 root root 1.1K Sep 2 07:15 server-cert.pem

-rw-------. 1 root root 1.7K Sep 2 07:15 server-key.pem

-rw-r-----. 1 mysql mysql 535 Sep 18 02:25 slow.log

drwxr-x---. 2 mysql mysql 8.0K Sep 2 07:14 sys -- 文件夹

问题1:仔细观察,会发现'information_schema'库没有对应的文件夹,这是为什么呢?

答:information_schema库存在于内存中,在启动时创建。

(3)每张表对应一组文件mysql> use aa;

Database changed

mysql> show tables;

Empty set (0.00 sec)

mysql> create table a1(a int primary key auto_increment);

Query OK, 0 rows affected (0.01 sec)

mysql> show tables;

+--------------+

| Tables_in_aa |

+--------------+

| a1 |

+--------------+

1 row in set (0.00 sec)

mysql> insert into a1 values (null),(null),(null);

Query OK, 3 rows affected (0.04 sec)

Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from a1;

+---+

| a |

+---+

| 1 |

| 2 |

| 3 |

+---+

3 rows in set (0.00 sec)

mysql> show create table a1G

*************************** 1. row ***************************

Table: a1

Create Table: CREATE TABLE `a1` (

`a` int(11) NOT NULL AUTO_INCREMENT,

PRIMARY KEY (`a`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

[root@multi_instance ~]# ls -lh /data/mysql/aa/

total 112K

-rw-r-----. 1 mysql mysql 8.4K Sep 18 03:39 a1.frm

-rw-r-----. 1 mysql mysql 96K Sep 18 03:39 a1.ibd

-rw-r-----. 1 mysql mysql 65 Sep 18 03:27 db.opt

5、MySQL主要文件

(1)数据库配置文件存放路径:

CentOS 7:/etc/my.cnf

Windows:C:ProgramDataMySQLMySQL Server 8.0my.ini

配置文件模板[client]

[mysqld]

########basic settings########

server-id = 3306

basedir = /usr/local/mysql/

datadir=/data/mysql

pid-file=/data/mysql/mysql.pid

port = 3306

socket=/tmp/mysql.sock

user = mysql

#character_set_server=utf8mb4 -- ‘#’表示注释

########log settings########

log_error = error.log

slow_query_log = 1

slow_query_log_file = slow.log

[mysqld-8.0]

[mysqldump]

[mysqladmin]

[mysql_multi]

[mysqld1]

[mysqld2]

(2)表结构定义文件

1)表结构定义文件每个表对应一个表结构文件

表结构文件名以.frm结尾

表结构文件是二进制文件mysql> create table a2 (a int primary key)engine=myisam charset=utf8mb4;

Query OK, 0 rows affected (0.00 sec)

[root@multi_instance ~]# ls -lh /data/mysql/aa/

total 128K

-rw-r-----. 1 mysql mysql 8.4K Sep 18 03:39 a1.frm -- 表结构定义文件

-rw-r-----. 1 mysql mysql 96K Sep 18 04:11 a1.ibd -- innodb引擎数据文件

-rw-r-----. 1 mysql mysql 8.4K Sep 18 04:29 a2.frm -- 表结构定义文件

-rw-r-----. 1 mysql mysql 0 Sep 18 04:29 a2.MYD -- myisam引擎数据文件

-rw-r-----. 1 mysql mysql 1.0K Sep 18 04:29 a2.MYI -- myisam引擎所有文件

-rw-r-----. 1 mysql mysql 65 Sep 18 03:27 db.opt -- 用来记录该库的默认字符集编码和字符集排序规则用的

[root@multi_instance ~]# cat /data/mysql/aa/db.opt

default-character-set=latin1

default-collation=latin1_swedish_ci

2)表结构文件的查看(需要安装msql-utilities工具包)-- 查看版本信息

[root@multi_instance ~]# mysqldbcompare --version

MySQL Utilities mysqldbcompare version 1.6.5

License type: GPLv2

-- 查看.frm文件(即表结构定义文件)

[root@multi_instance ~]# mysqlfrm --diagnostic /data/mysql/aa/a1.frm

# WARNING: Cannot generate character set or collation names without the --server option.

# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.

# Reading .frm file for /data/mysql/aa/a1.frm:

# The .frm file is a TABLE.

# CREATE TABLE Statement:

CREATE TABLE `aa`.`a1` (

`a` int(11) NOT NULL AUTO_INCREMENT,

PRIMARY KEY `PRIMARY` (`a`)

) ENGINE=InnoDB;

#...done.

(3)错误日志参数:log_error

默认名:机器名.err

建议统一改成一个固定的名称,例如'mysql.err'

方便定位错误

在mysql实例无法启动的时候,首要的任务就是查看该文件[mysqld]

log_error=mysql.err可将错误日志配置到系统日志文件[mysqld_safe]

syslog

syslog=stock #mysqld_stock

(4)慢查询日志将运行超过某一个时间阈(yu四声)值的SQL语句记录到文件

MySQL < 5.1 :以秒为单位

MySQL >= 5.1 : 以毫秒为单位

MySQL >= 5.5 : 可以将慢查询日志记录到表

MySQL >= 5.6 : 以更细的粒度记录慢查询

MySQL >= 5.7 : 将时区信息写入到慢查询日志,增加timestamps支持

命名参数:slow_query_log_file

建议配置成统一的名字

作用:用于优化查询

1)相关参数slow_query_log:是否开启慢查询日志

slow_query_log_file:慢查询日志文件名, 在my.cnf我们已经定义为slow.log,默认是 机器名-slow.log

long_query_time:制定慢查询阈值, 单位是秒,且当版本 >=5.5.X,支持毫秒。例如0.5即为500ms

大于该值,不包括值本身。例如该值为2,则执行时间正好等于2的SQL语句不会记录

log_queries_not_using_indexes:将没有使用索引的SQL记录到慢查询日志

如果一开始因为数据少,查表快,耗时的SQL语句没被记录,当数据量大时,该SQL可能会执行很长时间

需要测试阶段就要发现问题,减小上线后出现问题的概率

log_throttle_queries_not_using_indexes:限制每分钟内,在慢查询日志中,去记录没有使用索引的SQL语句的次数;版本需要>=5.6.X

因为没有使用索引的SQL可能会短时间重复执行,为了避免日志快速增大,限制每分钟的记录次数

min_examined_row_limit:扫描记录少于该值的SQL不记录到慢查询日志

结合去记录没有使用索引的SQL语句的例子,有可能存在某一个表,数据量维持在百行左右,且没有建立索引。这种表即使不建立索引,查询也很快,扫描记录很小,如果确定有这种表,则可以通过此参数设置,将这个SQL不记录到慢查询日志。

log_slow_admin_statements:记录超时的管理操作SQL到慢查询日志,比如ALTER/ANALYZE TABLE

log_output:慢查询日志的格式,[FILE | TABLE | NONE],默认是FILE;版本>=5.5

如果设置为TABLE,则记录到mysql.slow_log

log_slow_slave_statements:在从服务器上开启慢查询日志

log_timestamps:写入时区信息。可根据需求记录UTC时间或者服务器本地系统时间

2)测试实验配置文件中的相关参数设置[mysqld]

slow_query_log = 1

slow_query_log_file = slow.log

log_queries_not_using_indexes = 1

log_slow_admin_statements = 1

log_slow_slave_statements = 1

log_throttle_queries_not_using_indexes = 10

#8.0.11不支持下面的参数,新参数:binlog_expire_logs_seconds = 90

expire_logs_days = 90

long_query_time = 2

#min_examined_row_limit = 100

-- 确认相关参数是否生效

mysql> show variables like 'slow_query_log';

+----------------+-------+

| Variable_name | Value |

+----------------+-------+

| slow_query_log | ON |

+----------------+-------+

1 row in set (0.00 sec)

mysql> show variables like 'long_query_time';

+-----------------+----------+

| Variable_name | Value |

+-----------------+----------+

| long_query_time | 2.000000 |

+-----------------+----------+

1 row in set (0.00 sec)

mysql> show variables like '%min_ex%';

+------------------------+-------+

| Variable_name | Value |

+------------------------+-------+

| min_examined_row_limit | 0 |

+------------------------+-------+

1 row in set (0.00 sec)查看慢查询日志-- 会话1

[root@multi_instance ~]# tail -f /data/mysql/slow.log

-- 此时是没有相关操作语句的模拟耗时-- 会话2

mysql> select sleep(5);

+----------+

| sleep(5) |

+----------+

| 0 |

+----------+

1 row in set (5.00 sec)再次查看慢查询日志# Time: 2018-09-18T09:44:02.517298Z

# User@Host: root[root] @ localhost [] Id: 2

# Query_time: 5.003318 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 -- 这是重点信息

SET timestamp=1537263842;

select sleep(5);

通过此次测试,可以发现慢查询日志记录了操作时间点、操作的用户、操作耗时、操作语句信息

(5)通用日志可以记录数据库素有相关操作

参数:general_log

默认文件名:机器名.log

默认未开启mysql> show variables like 'general_log';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| general_log | OFF |

+---------------+-------+

1 row in set (0.01 sec)同样可以将日志保存到表

开启性能下降明显

□参考文献:本文内容参考《MySQL技术内幕 InnoDB存储引擎 第2版》

mysql 管理instance_MySQL从零开始——第三章 MySQL体系结构相关推荐

  1. 【面试宝典】软件测试工程师2021烫手精华版(第三章Mysql基础篇)

    第三章 Mysql 基础 一. 基础知识 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库 什么是关系型数据库,主键,外键,索引分别是什么? 关系型数据库是由多张能 ...

  2. mysql 索引 ppt_第三章 MySQL索引.ppt

    第三章 MySQL索引 MYSQL索引 课程介绍 本课程主要介绍了MySQL数据库的表达式运算符.MySQL函数,索引的用法.存储过程的使用,视图和触发器等方面的知识, 以应用为目标,具有较强的实践性 ...

  3. 《php开发典型模块大全》读书笔记 第三章 mysql数据库基础

    第三章  mysql基础 show columns  from table describe table alter table 修改表 rename   table   t1  to   t2 整型 ...

  4. mysql 导入百万级数据 几种 java_Java 修行第034天--执行计划及其使用--Oracle数据导入导出--第三章MySQL使用...

    执行计划中牢记几句话: -- 尽量避免是*代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描 -- 尽可能少的使用like关键字进行模糊查询 -- 建立适当的索引可以提高查询效率 十三. ...

  5. python从2 1 2 2 2 63_Python从零开始第三章数据处理与分析python中的dplyr(2)

    目录 第二章(pandas) Python从零开始第三章数据处理与分析python中的dplyr(2) =============================================== ...

  6. 关于高性能mysql的读书报告_《高性能MySQL》读书笔记:第一章[MySQL架构与历史]...

    <高性能MySQL>读书笔记:第一章[MySQL架构与历史] MySQL逻辑架构 MySQL最优秀的一点就是它的存储架构,将查询处理,系统任务,数据存储/提取相分离 并发控制 通过读写锁实 ...

  7. ZFS管理手册:第三章ZIL

    ZFS管理手册:第三章ZIL 术语 在开始之前,我们需要了解一些在论坛.博客帖子.邮件列表和一般性讨论中似乎令人困惑的术语.它把我搞糊涂了,直到我写这篇文章的时候,我才真正的明白.所以,让我们开始吧: ...

  8. 【软件体系结构】考点总结 第三章 软件体系结构风格 XJU

    软件体系结构 第三章 软件体系结构风格 前言   本文为XJU本科期间博主根据 <软件体系结构原理.方法与实践>第二版所作的期末考点总结,因为是课堂重点总结,所以有些重要知识点没有涵盖还请 ...

  9. 计算机网络结构ppt课件,第三章计算机网络体系结构ppt课件.ppt

    <第三章计算机网络体系结构ppt课件.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<第三章计算机网络体系结构ppt课件.ppt>文档请在天天文库 ...

最新文章

  1. 职称考试还要考计算机 英语,强烈建议取消所谓的英语职称和计算机考试
  2. 那些到了 30 岁的技术人,后来都去哪了?
  3. MySQL MyISAM/InnoDB高并发优化经验
  4. easyUI的combobox设置隐藏和显示
  5. Unity3D——C#编译到运行的过程分析
  6. 学习vi和vim编辑器(8):全局替换(1)
  7. PageRank算法原理与实现
  8. JQuery datatables 标题和内容居中显示
  9. 关于时间操作工具类整理
  10. 每期一词:catastrophe
  11. spring4笔记----依赖注入的两种形式
  12. 使用LoRa技术进行智慧城市转型
  13. BootStrap--CSS组件
  14. Linux内核编程02:Kbuild子系统
  15. 热烈庆祝阳光网驿-行业软件交流平台与北京汉邦极通科技有限公司成功合作
  16. 机器学习:XGBoost算法
  17. mysql异地双活架构,银行跨数据中心数据库双活架构设计:五大难点攻克
  18. 数字图像处理——第二章 数字图像基础
  19. 操作系统2015(四川大学软件学院)
  20. linux文件e属性,三、Linux文件属性

热门文章

  1. 神仙级控线练习,文艺极简水彩线描简笔画植物:草叶集(二)
  2. python适合做嵌入式开发吗_python能做嵌入式吗
  3. flink 相关资料
  4. 7-20 奥运排行榜
  5. MATLAB app 实现音乐播放器
  6. GitChat在做什么
  7. 泛微齐业成,一文告诉你如何实现全程数字化的预算管理
  8. DDoS攻击的一些防护方法
  9. eclipse + pydev远程调试OpenStack
  10. 用计算机管理员同步一下文件,《计算机应用基础(Windows 7 Office 2010)同步训练》0711.docx...