1 实例与数据库概念

在数据库领域中有两个词很容易混淆,这就是“数据库”(database) 和“实例”(instance)。作为常见的数据库术语,这两个词的定义如下:

  • 数据库:物理操作系统文件或其他形式文件类型的集合。

  • 在MySQL数据库中, 数据库文件可以是frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时, 数据库的文件可能不是操作系统上的文件, 而是存放于内存之中的文件, 但是定义仍然不变。

  • MySQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。

  • 需要牢记的是, 数据库实例才是真正用于操作数据库文件的。

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

  • MySQL被设计为一个单进程多线程架构的数据库, 这点与SQL Server比较类似, 但与Oracle多进程的架构有所不同(Oracle的Windows版本也是单进程多线程架构的)。这也就是说, MySQL数据库实例在系统上的表现就是一个进程

  • MySQL 启动实例时如果没有参数文件会怎么样?像 Oracle 一样失败嘛?

    • 当启动实例时, MySQL数据库会去读取配置文件, 这与Oracle的参数文件(spfile)相似, 但 Oracle中如果没有参数文件, 在启动实例时会提示找不到该参数文件, 数据库启动失败。而在MySQL数据库中, 可以没有配置文件, 在这种情况下, MySQL会按照编译时的默认参数设置启动实例。
  • 既然 Mysql 的配置读取路径是 /etc/my.cnf→/etc/mysql/my.cnf→/usr/local/mysql/etc/my.cnf→~/.my.cnf, 如果这些路径都有配置文件的话, 哪个生效呢?

    • 最后一个。
    • 在Linux环境下, 配置文件一般放在/etc/my.cnf下。在Windows平台下, 配置文件的后缀名可能是.cnf, 也可能是.ini。
  • Linux 下 MySQL 默认的 datadir 在什么位置?配置文件中的就是最终地址嘛?

    • 默认配置文件是 datadir 为 /usr/local/mysql/data
    • 但只是一个软连接文件, 指向 /opt/mysql_data
    • 这提示我们应该保证 /opt/mysql_data 这个目录的访问权限只能设置为 mysql 用户和 mysql 组使用

2 mysql 体系结构

Mysql 体系结构:image.png 从上到下依次是:

  • Connection Pool 连接池组件

  • Management Service & Utillties 管理服务和工具组件

  • SQL Interface 为 SQL 接口组件

  • Parser Quary Translation 查询分析组件

  • Optimizer Access Paths 优化器组件

  • Cache 缓冲组件

  • Pluggable Storage Engines 插件式存储引擎

  • File System 物理文件

  • 其中, 插件式存储引擎是 MySQL 区别于其他数据库的一个重要特征。提供了一系列标准的管理和服务支持。另外特别注意存储引擎是基于表而非数据库的

3 MySQL 存储引擎

  • 存储引擎的好处是, 每个存储引擎都有各自的特点, 能够根据具体的应用建立不同存储引擎表。对于开发人员来说, 存储引擎对其是透明的, 但了解各种存储引擎的区别对于开发人员来说也是有好处的。对于DBA来说, 他们应该深刻地认识到MySQL数据库的核心在于存储引擎。

1 InnoDB 引擎

  • InnoDB存储引擎支持{{c1::事务}}, 其设计目标主要面向{{c1::在线事务处理(OLTP)}}的应用。其特点是{{c2::行锁设计、支持外键}}, 并支持类似于Oracle的{{c2::非锁定读}}, 即{{c2::默认读取操作不会产生锁}}。

  • 从MySQL数据库5.5.8版本开始, InnoDB存储引擎是默认的存储引擎。

  • InnoDB存储引擎将数据放在一个逻辑的{{c1::表空间}}中, 这个{{c1::表空间}}就像黑盒一样由InnoDB存储引擎自身进行管理。从MySQL 4.1(包括4.1)版本开始, 它可以将每个InnoDB存储引擎的表单独存放到一个独立的{{c2::ibd}}文件中。此外, InnoDB存储引擎支持用{{c3::裸设备(row disk)}}用来建立其{{c1::表空间}}。

  • InnoDB通过使用多版本并发控制(MVCC) 来获得高并发性, 并且实现了SQL标准的4种隔离级别, 默认为REPEATABLE级别。

  • InnoDB储存引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。

  • 对于表中数据的存储, InnoDB存储引擎采用了聚集(clustered) 的方式, 因此每张表的存储都是按主键的顺序进行存放。如果没有显式地在表定义时指定主键, InnoDB存储引擎会为每一行生成一个6字节的ROWID, 并以此作为主键。

5 连接 MySQL

  • 连接MySQL操作是一个连接进程MySQL数据库实例进行通信。从程序设计的角度来说, 本质上是进程通信

  • 如果对进程通信比较了解, 可以知道常用的进程通信方式有{{c1::管道}}、{{c2::命名管道}}、{{c3::命名字}}、{{c4::TCP/IP套接字}}、{{c5::UNIX域套接字}}。MySQL数据库提供的连接方式从本质上看都是上述提及的进程通信方式。

1 TCP/IP 套接字连接

  • TCP/IP套接字连接方式是MySQL数据库在任何平台下都提供的连接方式, 也是网络中使用得最多的一种方式。

  • TCP/IP套接字连接方式是指什么样的连接?

    • 在TCP/IP连接上建立一个基于网络的连接请求, 一般情况下客户端(client)在一台服务器上, 而MySQL实例(server)在另一台服务器上, 这两台机器通过一个TCP/IP网络连接。例如用户可以在Windows服务器下请求一台远程Linux服务器下的MySQL实例
    • 如用 mysql-h 192.168.0.101 -u david -p 来以 david 用户身份登录内网ip中的mysql服务器
  • 如何查看 MySQL 中的用户权限表?视图在mysql架构下,表名为user?

    • SELECT host,user,password FROM user;
    • image.png

2 命名管道和共享内存

  • 如果两个需要进程通信的进程在同一台服务器上, 那么可以使用命名管道, Microsoft SQL Server数据库默认安装后的本地连接也是使用命名管道。
  • 在MySQL数据库中须在配置文件中启用—enable-named-pipe选项。在MySQL 4.1之后的版本中, MySQL还提供了共享内存的连接方式, 这是通过在配置文件中添加—shared-memory实现的。如果想使用共享内存的方式, 在连接时, MySQL客户端还必须使用—protocol=memory选项。

3 UNIX 域套接字

  • 在Linux和UNIX环境下, 还可以使用UNIX域套接字。UNIX域套接字其实不是一个网络协议, 所以只能在MySQL客户端和数据库实例在一台服务器上的情况下使用。用户可以在配置文件中指定套接字文件的路径, 如—socket=/tmp/mysql.sock, 链接时用 mysql -u david -S /tmp/mysql.sock