上犹电脑信息网我们一直在努力
您的位置:上犹电脑信息网 > 电脑怎么了 > 怎么启动mysql-MySQL从零开始——第三章 MySQL体系结构

怎么启动mysql-MySQL从零开始——第三章 MySQL体系结构

作者:上犹日期:

返回目录:电脑怎么了

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

在数据库领域中有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 mysqlmysql 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.pidroot 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)数据文件的路径


参数:datadir


mysql> 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/mysqltotal 121Mdrwxr-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 ibtmp1drwxr-x---. 2 mysql mysql 4.0K Sep 2 07:14 mysql -- 文件夹-rw-r-----. 1 mysql mysql 5 Sep 18 02:25 mysql.piddrwxr-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.logdrwxr-x---. 2 mysql mysql 8.0K Sep 2 07:14 sys -- 文件夹

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


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


(3)每张表对应一组文件


mysql> use aa;Database changedmysql> 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: 0mysql> select * from a1;+---+| a |+---+| 1 || 2 || 3 |+---+3 rows in set (0.00 sec)mysql> show create table a1G*************************** 1. row *************************** Table: a1Create Table: CREATE TABLE `a1` ( `a` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`a`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin11 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 = 3306basedir = /usr/local/mysql/datadir=/data/mysqlpid-file=/data/mysql/mysql.pidport = 3306socket=/tmp/mysql.sockuser = mysql#character_set_server=utf8mb4 -- ‘#’表示注释########log settings########log_error = error.logslow_query_log = 1slow_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.optdefault-character-set=latin1default-collation=latin1_swedish_ci

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


-- 查看版本信息[root@multi_instance ~]# mysqldbcompare --versionMySQL 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]syslogsyslog=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.loglong_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 TABLElog_output:慢查询日志的格式,[FILE | TABLE | NONE],默认是FILE;版本>=5.5如果设置为TABLE,则记录到mysql.slow_loglog_slow_slave_statements:在从服务器上开启慢查询日志log_timestamps:写入时区信息。可根据需求记录UTC时间或者服务器本地系统时间

2)测试实验


  • 配置文件中的相关参数设置

[mysqld]slow_query_log = 1slow_query_log_file = slow.loglog_queries_not_using_indexes = 1log_slow_admin_statements = 1log_slow_slave_statements = 1log_throttle_queries_not_using_indexes = 10#8.0.11不支持下面的参数,新参数:binlog_expire_logs_seconds = 90expire_logs_days = 90long_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 -- 此时是没有相关操作语句的

  • 模拟耗时

-- 会话2mysql> 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版》


相关阅读

关键词不能为空
极力推荐

电脑蓝屏_电脑怎么了_win7问题_win10问题_设置问题_文件问题_上犹电脑信息网

关于我们