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 体系结构:
从上到下依次是:
-
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;
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