MySQL是一个关系型数据库管理系统
一、数据库管理系统
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。 数据库是结构化的数据集合,它是对底层物理数据做的一层抽象,因此,有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置,数据库管理系统能够把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理。
按照数据结构化的方式的不同可将数据库分为:
层次型数据库、网状型数据库、关系型数据库、对象-关系型数据库、非关系型数据库
二、关系型数据库基础理论
1、RDBMS(关系型数据库管理系统)的基本结构:
分析器先分析SQL语句,然后交给操作求解器生成执行路径,再由计划执行器生成执行计划,并由优化器进行优化
2、RDBMS的优点:
数据独立性,高效数据存取,数据完整性(事务)和安全性,数据管理,并发控制(琐机制)和故障恢复,开发周期缩短
3、关系模型中的组件:
库:表的集合,每个表都有一个惟一的名字
表(关系):由行(row, record, tuple)和列(field, column, attribute)组成
行:代表一组数据之间的联系;
列:有其允许取值的集合,称之为该属性域;
视图:虚表,存储下来的select语句
索引:
存储过程:代码段,一些SQL语句,无返回值
存储函数:代码段,一些SQL语句,有返回值
触发器:代码,实现当某个动作发生时触发其它动作
游标:
事务:ACID
用户:数据访问授权
4、数据字典:又称系统编目(system catalog),保存了数据库服务器上的元数据,这些元数据也通过数据库保存。
元数据:
关系的名称、每个关系中各字段的名称、各字段的类型和长度、约束、每个关系上的视图的名字及视图的定义
授权的用户名字、用户的授权和帐户信息
统计类数据:每个关系中字段数、每个关系中行数、每个关系的存储方法
5、常见的关系型数据库管理系统
Oracle、Sybase、Infomix、DB2、SQL Server、MySQL --> MariaDB(MariaDB是MySQL的衍生版)
三、mysql
1、mysql的特性
查询速度快(完全多线程、支持查询缓存),良好的伸缩性、易用性、移植性、兼容性,支持多用户,较广泛的应用支持(有很多应用接口)
2、MySQL核心组件:
connection pool(连接池):认证、线程重用、连接数限制、内存检查、缓存;
SQL接口:DDL, DML, 关系型数据库的基本抽象;
parser(分析器):查询转换、对象权限检查;
optimizer(优化器):访问路径,性能相关的统计数据;
caches和buffers:与存储引擎自身相关的I/O性能提升工具;
pluggable storage engines(插件式存储引擎):
MyISAM(索引和数据分开存放)、InnoDB(变种:XtraDB,索引和数据一起存放)、Memory、Merge、Federated、CSV、Archive、Blackholl、Aria、SphinxSE、TokuDB
存储引擎是表级别的,同一库中的不同表可以使用不同的存储引擎
3、MySQL安装方式:
①rpm包安装
OS vendor、项目方提供
②通用二进制格式
展开、配置后即可使用
③源码编译安装
要用cmake编译
4、MySQL(MariaDB)服务端:监听于3306/tcp
①CentOS 6.5:mysql-server(rpm包名),mysqld(服务进程)
服务脚本:/etc/rc.d/init.d/mysqld
主服务程序:/usr/bin/mysqld_safe
数据目录:/var/lib/mysql
配置文件:/etc/my.cnf(服务端和客户端共用)
客户端程序:/usr/bin/mysql
unix sock: /var/lib/mysql/mysql.sock
mysqld第一次启动之前需要先初始化:创建mysqld服务自身运行所依赖的元数据库mysql
②CentOS 7:mariadb-server,mysqld
# systemctl start mariadb.service
[root@node3 ~]# yum -y install mysql-server ... Installed: mysql-server.x86_64 0:5.1.73-5.el6_6 Dependency Installed: #安装服务端程序会一并安装mysql客户端程序和mysql-libs mysql.x86_64 0:5.1.73-5.el6_6 mysql-libs.x86_64 0:5.1.73-5.el6_6 perl-DBD-MySQL.x86_64 0:4.013-3.el6 perl-DBI.x86_64 0:1.609-4.el6 Complete! [root@node3 ~]# rpm -ql mysql-server /etc/logrotate.d/mysqld /etc/rc.d/init.d/mysqld #服务脚本 /usr/bin/innochecksum /usr/bin/myisam_ftdump /usr/bin/myisamchk /usr/bin/myisamlog /usr/bin/myisampack /usr/bin/mysql_convert_table_format /usr/bin/mysql_fix_extensions /usr/bin/mysql_fix_privilege_tables /usr/bin/mysql_install_db #初始化数据库 /usr/bin/mysql_secure_installation #执行一些与安全相关的操作,如设置root密码、删除匿名账号、取消root远程登录等 /usr/bin/mysql_setpermission /usr/bin/mysql_tzinfo_to_sql /usr/bin/mysql_upgrade /usr/bin/mysql_zap /usr/bin/mysqlbug /usr/bin/mysqld_multi #在同一主机上同时启动多个mysql服务实例的程序 /usr/bin/mysqld_safe /usr/bin/mysqldumpslow /usr/bin/mysqlhotcopy /usr/bin/mysqltest /usr/bin/perror /usr/bin/replace /usr/bin/resolve_stack_dump /usr/bin/resolveip ... /usr/share/mysql/my-huge.cnf /usr/share/mysql/my-innodb-heavy-4G.cnf /usr/share/mysql/my-large.cnf /usr/share/mysql/my-medium.cnf /usr/share/mysql/my-small.cnf /usr/share/mysql/mysql_fix_privilege_tables.sql /usr/share/mysql/mysql_system_tables.sql /usr/share/mysql/mysql_system_tables_data.sql /usr/share/mysql/mysql_test_data_timezone.sql /var/lib/mysql #默认的数据目录 /var/log/mysqld.log /var/run/mysqld [root@node3 ~]# rpm -ql mysql-libs /etc/ld.so.conf.d/mysql-x86_64.conf /etc/my.cnf #配置文件 /usr/lib64/mysql /usr/lib64/mysql/libmysqlclient.so.16 ... [root@node3 ~]# service mysqld start Initializing MySQL database: WARNING: The host 'node2' could not be looked up with resolveip. This probably means that your libc libraries are not 100 % compatible with this binary MySQL version. The MySQL daemon, mysqld, should work normally with the exception that host name resolving will not work. This means that you should use IP addresses instead of hostnames when specifying MySQL privileges ! Installing MySQL system tables... OK Filling help tables... OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h node3 password 'new-password' Alternatively you can run: /usr/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd /usr ; /usr/bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd /usr/mysql-test ; perl mysql-test-run.pl Please report any problems with the /usr/bin/mysqlbug script! [ OK ] Starting mysqld: [ OK ] [root@node3 ~]# netstat -tlnp #3306端口已监听 ... tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4549/mysqld ...
5、配置文件:/etc/my.cnf,/etc/mysql/my.cnf,~/.my.cnf
这些文件可为所有的mysql程序(如mysqld, mysql, mysqladmin, mysqld_safe)提供配置。某个mysql程序也不一定仅依赖于某一个配置文件
定义格式:
[programe] # [mysql]表示对mysql命令有效,[client]表示对所有的客户端类程序有效,[mysqld]表示对所有的服务器类程序有效
parameter1 =
...
读取配置文件的顺序:/etc/my.cnf,/etc/mysql/my.cnf,~/.my.cnf
例如,如果觉得以某个账号每次连接mysql服务器端都输入密码显得麻烦,就可以:
vim ~/.my.cnf
[client]
user=root
host=localhost
password=magedu
当mysql客户端连接服务器端时会自动读取该配置文件获取参数值
mysqld --verbose --help #获取帮助
--defaults-extra-file=#:额外读取的配置文件;
--defaults-file=#:仅读取此处指定的配置文件
--print-defaults:列出该程序的相关参数
6、mysql存储的文件和日志
文件:数据文件和索引文件
日志:事务日志、二进制日志、查询日志、慢查询日志、错误日志、中继日志
7、mysql的服务器变量和状态变量
⑴服务器变量:mysql的各种工作属性
①类型:
全局:对所有会话都生效;
所有的会话在建立时都从全局继承,但继承完成后每个会话独立维护自己会话级变量
修改全局的服务器变量仅对之后建立的会话生效
要求有管理权限
会话:仅对当前会话有效;
修改即刻生效;
不要求管理权限
②查看:
mysql> SHOW {GLOBAL|SESSION} VARIABLES [LIKE clause];
mysql> SELECT @@{GLOBAL|SESSION}.VARIABLE_NAME;
mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='';
mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='';
③修改方式:
动态修改:会话级别,立即生效;全局级别,新建立的会话有效;重启服务会失效;并非所有的服务器变量都支持动态修改
mysql> SET {GLOBAL|SESSION} VARIABLE_NAME='VALUE';
静态修改:修改配置文件,或修改传递给mysqld的选项的值;重启后有效;持久有效
[mysqld]
sql_mode = 'STRICT_ALL_TABLES'
⑵mysql运行时的诸多统计数据会被记录在状态变量中:
SHOW {GLOBAL|SESSION} STATUS [LIKE ''];
8、mysql的数据字典(存储元数据的库):
infomation_schema
mysql
performance_schema #跟性能相关的统计数据
9、mysql程序的类别:
服务器端程序:启动并监听于套接字上;mysqld, mysqld_safe, mysqld_multi
客户端程序:可通过mysql协议连入服务器并发出请求;mysql, mysqlbinlog, mysqladmin, mysqldump等
工具程序:运行于服务器进程所在的主机,实现一些管理或维护操作,myisamchk
10、mysql客户端类程序的通用选项
-u, --user= #指定以哪个用户身份连接,缺省为root
-h, --host= #指定连接到哪台服务器,缺省为localhost
-p, --password=
--protocol=
tcp、socket(unix sock)
pipe、memory(这两个仅适用于windows系统本机通信)
-P,--port=:当protocol是tcp时使用的端口
--socket:相当于--protocol socket
-D,--database= #指定连接服务器后使用哪个库
-N : Don't write column names in results
-s : Print results with a tab as separator,不以表格的形式输出结果
11、客户端程序mysql的基本使用
⑴连接数据库
mysql [-u USERNAME] [-h SERVER] -p[PASSWORD] #密码可交互输入
-e "SQL语句":不用进入交互式模式而直接执行某个语句
例如 mysql -e "create database testdb" -h 192.168.30.20 -u root -p
mysql的用户账号:USERNAME@HOST
USERNAME: 用户名
HOST: 仅允许此用户通过此处指定的主机登录mysqld服务;
例如root@localhost, root@'127.0.0.1', root@'HOSTNAME'
mysql服务端在初始化时会创建一个root@localhost的账号,但没有密码,需手动设置。此root跟linux系统的root用户无关
⑵使用方式有两类:
①批模式:mysql < /path/from/somefile.sql
②交互式:
客户端命令:无需分隔符结尾
help, \h:列出所有客户端命令
clear, \c:终结语句的执行;例如 create database hellodb\c
ego, \G:竖排显示
go, \g:当不知道分隔符是什么时,可直接用这个替代
delimiter, \d:修改分隔符;例如 \d #
prompt, \R:修改mysql命令提示符
quit, exit, \q:退出
source, \. /path/from/somefile.sql:类似于批模式
相当于mysql < /path/from/somefile.sql
system, \! COMMAND:运行shell命令
use, \u DB_NAME:将指定的库设为默认库
服务器端命令:必须以分隔符结尾,默认为分号
help KEYWORD #获取命令的帮助信息
功能特性:
命令历史
命令行编辑功能:
Ctrl+a:快速移动光标至行首
Ctrl+e:快速移动光标至行尾
Ctrl+w:删除光标之前的单词
Ctrl+u:删除行首至光标处的所有内容
Ctrl+y:粘贴使用Ctrl+w或Ctrl+u删除的内容
提示符:
mysql> 等待输入命令
-> 续行
'> 还需要补全后半部单引号
"> 还需要补全后半部双引号
`> 还需要补全后半部反引号
12、mysqladmin:一个执行管理操作的客户端程序。它可用来检查服务器的配置和当前的状态,创建并删除数据库等等
mysqladmin [options] command [arg] [command [arg]] ...
选项:
-i/--sleep #: 间隔几秒重复执行命令
-c/--count #: 重复执行的次数,只能和-i选项一起使用
子命令:
create DB_NAME
drop DB_NAME
status:显示mysqld的简要状态信息,专用选项:
extend-status:显示mysqld的所有状态变量
flush-privileges:刷新授权表,相当于reload命令
flush-hosts:清除dns缓存及被拒绝的客户端列表缓存
flush-logs:滚动日志, 二进制日志和中继日志
flush-status:重置各状态变量
flush-tables:关闭当前打开的所有的表文件句柄
flush-treads:重置线程缓存
password:设置密码
ping:测试服务器是否在线
processlist:显示当前服务器上的所有线程
refresh:相当于执行flush-hosts和flush-logs
shutdown:关闭服务器进程
start-slave, stop-slave:启动、关闭从服务器线程;
variables:显示服务器变量
13、mysql有一些图形化的客户端程序:
phpMyAdmin、Navicat for mysql、Toad for mysql、mysql front、sqlyog
14、初始化操作
⑴给用户设置密码,有三种方式:
①SET PASSWORD FOR 'username'@'host' = PASSWORD('your_password');
②UPDATE mysql.user SET Password=PASSWORD('your_password') WHERE User='username' [AND Host='hostname or ip'];
③mysqladmin -u USERNMAE [-h HOSTNAME_OR_IP] password 新密码 -p 旧密码
因为初始时root没有密码,所以-p旧密码一项可以省略
⑵删除匿名用户:
DROP USER ''@'HOSTNAME'; 或DELETE FROM mysql.user WHERE User='';
15、禁止mysql进行反向名称解析
当从其它主机连接mysql数据库时,mysql服务默认会对客户端的ip地址进行反向名称解析,反向解析当然会耗费时间,另外,如果msyql数据库并未给反向解析得到的主机名授权,就会造成客户端无法连接的状况。因此,通常建议禁止mysql进行反向名称解析,方法很简单,在msyql server的配置文件my.cnf中[mysqld]段下添加如下一行即可:
skip-name-resolve
[root@node3 ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; #查看有哪些库 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.04 sec) mysql> use mysql #设为默认库 Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | event | ... ... | user |mysql用户信息表 +---------------------------+ 23 rows in set (0.00 sec) mysql> desc user; #查看表结构定义 +-----------------------+-----------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+-----------------------------------+------+-----+---------+-------+ | Host | char(60) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Password | char(41) | NO | | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | ... ... 39 rows in set (0.00 sec) mysql> select User,Host,Password from user; +------+-----------+----------+ | User | Host | Password | +------+-----------+----------+ | root | localhost | | | root | node3 | | | root | 127.0.0.1 | | | | localhost | | | | node3 | | +------+-----------+----------+ 5 rows in set (0.00 sec) mysql> update user set Password=password('magedu') where User='root'; #将user为root的所有账号的密码一并更新 Query OK, 3 rows affected (0.02 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> delete from user where User=''; #删除匿名用户 Query OK, 2 rows affected (0.00 sec) mysql> flush privileges; #刷新授权表 Query OK, 0 rows affected (0.00 sec) mysql> select User,Host,Password from user; +------+-----------+-------------------------------------------+ | User | Host | Password | +------+-----------+-------------------------------------------+ | root | localhost | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 | | root | node3 | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 | | root | 127.0.0.1 | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 | +------+-----------+-------------------------------------------+ 3 rows in set (0.00 sec) mysql> help #查看可使用的客户端命令 ... Note that all text commands must be first on line and end with ';' ? (\?) Synonym for `help'. clear (\c) Clear the current input statement. connect (\r) Reconnect to the server. Optional arguments are db and host. delimiter (\d) Set statement delimiter. edit (\e) Edit command with $EDITOR. ego (\G) Send command to mysql server, display result vertically. exit (\q) Exit mysql. Same as quit. go (\g) Send command to mysql server. help (\h) Display this help. nopager (\n) Disable pager, print to stdout. notee (\t) Don't write into outfile. pager (\P) Set PAGER [to_pager]. Print the query results via PAGER. print (\p) Print current command. prompt (\R) Change your mysql prompt. quit (\q) Quit mysql. ... mysql> create database testdb\c #终结语句的执行 mysql> \! date #执行shell命令 Mon Feb 29 08:59:44 CST 2016 mysql> help create database #查看某个服务器命令的帮助信息 Name: 'CREATE DATABASE' Description: Syntax: CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ... create_specification: [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name CREATE DATABASE creates a database with the given name. To use this statement, you need the CREATE privilege for the database. CREATE SCHEMA is a synonym for CREATE DATABASE. mysql> select version(); #查看mysql服务端版本 +-----------+ | version() | +-----------+ | 5.1.73 | +-----------+ 1 row in set (0.03 sec) mysql> select user(); #查看所有已登录的mysql用户 +----------------+ | user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) mysql> select current_user(); #查看当前会话的mysql用户身份 +----------------+ | current_user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) mysql> show global variables like 'query_cache%'; #查看与查询缓存有关的服务器变量 +------------------------------+---------+ | Variable_name | Value | +------------------------------+---------+ | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 0 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+---------+ 5 rows in set (0.00 sec) mysql> exit Bye [root@node3 ~]# mysqladmin status -p #显示mysql服务器的简要状态 Enter password: Uptime: 5477 Threads: 1 Questions: 51 Slow queries: 0 Opens: 30 Flush tables: 1 Open tables: 23 Queries per second avg: 0.9 [root@node3 ~]# mysql < hellodb.sql -p #批处理模式 Enter password: [root@node3 ~]# vim .my.cnf #在root用户家目录下创建一个配置文件 [client] user = root #此root和linux的root无关 host = localhost password = magedu [root@node3 ~]# mysql #不用再输入账户和密码了 ... mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | #新增了一个库 | mysql | | test | +--------------------+ 4 rows in set (0.00 sec)