关系数据库入门
关系数据库概述
- 数据持久化 - 将数据保存到能够长久保存数据的存储介质中,在掉电的情况下数据也不会丢失。
- 数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL数据库。 1970年,IBM的研究员E.F.Codd在Communication of the ACM上发表了名为A Relational Model of Data for Large Shared Data Banks的论文,提出了关系模型的概念,奠定了关系模型的理论基础。后来Codd又陆续发表多篇文章,论述了范式理论和衡量关系系统的12条标准,用数学理论奠定了关系数据库的基础。
- 关系数据库特点。
- 理论基础:集合论和关系代数。
- 具体表象:用二维表(有行和列)组织数据。
- 编程语言:结构化查询语言(SQL)。
- ER模型(实体关系模型)和概念模型图。 ER模型,全称为实体关系模型(Entity-Relationship Model),由美籍华裔计算机科学家陈品山先生提出,是概念数据模型的高层描述方式,如下图所示。
- 关系数据库产品。
- Oracle - 目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库,它实现了分布式处理的功能。在Oracle最新的12c版本中,还引入了多承租方架构,使用该架构可轻松部署和管理数据库云。
- DB2 - IBM公司开发的、主要运行于Unix(包括IBM自家的AIX)、Linux、以及Windows服务器版等系统的关系数据库产品。DB2历史悠久且被认为是最早使用SQL的数据库产品,它拥有较为强大的商业智能功能。
- SQL Server - 由Microsoft开发和推广的关系型数据库产品,最初适用于中小企业的数据管理,但是近年来它的应用范围有所扩展,部分大企业甚至是跨国公司也开始基于它来构建自己的数据管理系统。
- MySQL - MySQL是开放源代码的,任何人都可以在GPL(General Public License)的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。
- PostgreSQL - 在BSD许可证下发行的开放源代码的关系数据库产品。
MySQL简介
MySQL最早是由瑞典的MySQL AB公司开发的一个开放源码的关系数据库管理系统,该公司于2008年被昇阳微系统公司(Sun Microsystems)收购。在2009年,甲骨文公司(Oracle)收购昇阳微系统公司,因此在这之后MySQL成为了Oracle旗下产品。
MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用于中小型网站开发。随着MySQL的不断成熟,它也逐渐被应用于更多大规模网站和应用,比如维基百科、谷歌(Google)、脸书(Facebook)、淘宝网等网站都使用了MySQL来提供数据持久化服务。
甲骨文公司收购后昇阳微系统公司,大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,因此导致自由软件社区对于Oracle是否还会持续支持MySQL社区版(MySQL的各个发行版本中唯一免费的版本)有所担忧,MySQL的创始人麦克尔·维德纽斯以MySQL为基础,成立分支计划MariaDB(以他女儿的名字命名的数据库)。有许多原来使用MySQL数据库的公司(例如:维基百科)已经陆续完成了从MySQL数据库到MariaDB数据库的迁移。
安装和配置
说明:下面的安装和配置都是以CentOS Linux环境为例,如果需要在其他系统下安装MySQL,读者可以自行在网络上查找对应的安装教程)。
刚才说过,MySQL有一个分支版本名叫MariaDB,该数据库旨在继续保持MySQL数据库在GNU GPL下开源。如果要使用MariaDB作为MySQL的替代品,可以使用下面的命令进行安装。
代码语言:javascript复制yum install mariadb mariadb-serve
1.如果要安装官方版本的MySQL,可以在MySQL官方网站下载安装文件。首先在下载页面中选择平台和版本,然后找到对应的下载链接。下面以MySQL 5.7.26版本和Red Hat Enterprise Linux为例,直接下载包含所有安装文件的归档文件,解归档之后通过包管理工具进行安装。
代码语言:javascript复制wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-1.el7.x86_64.rpm-bundle.ta
tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.ta
如果系统上有MariaDB相关的文件,需要先移除MariaDB相关的文件。
代码语言:javascript复制yum list installed | grep mariadb | awk '{print $1}' | xargs yum erase -y
接下来可以按照如下所示的顺序用RPM(Redhat Package Manager)工具安装MySQL。
代码语言:javascript复制rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
可以使用下面的命令查看已经安装的MySQL相关的包。
代码语言:javascript复制rpm -qa | grep mysql
配置MySQL。
MySQL的配置文件在/etc目录下,名为my.cnf,默认的配置文件内容如下所示。如果对这个文件不理解并没有关系,什么时候用到这个配置文件什么时候再了解它就行了。
代码语言:javascript复制cat /etc/my.cnf
代码语言:javascript复制# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
启动MySQL服务。
可以使用下面的命令来启动MySQL。
代码语言:javascript复制service mysqld start
在CentOS 7中,更推荐使用下面的命令来启动MySQL。
代码语言:javascript复制systemctl start mysqld
启动MySQL成功后,可以通过下面的命令来检查网络端口使用情况,MySQL默认使用3306端口。
代码语言:javascript复制netstat -ntlp | grep mysql
也可以使用下面的命令查找是否有名为mysqld的进程。
代码语言:javascript复制pgrep mysqld
使用MySQL客户端工具连接服务器。
命令行工具:
代码语言:javascript复制mysql -u root -p
说明:启动客户端时,-u参数用来指定用户名,MySQL默认的超级管理账号为root;-p表示要输入密码(用户口令);如果连接的是其他主机而非本机,可以用-h来指定连接主机的主机名或IP地址。
如果是首次安装MySQL,可以使用下面的命令来找到默认的初始密码。
代码语言:javascript复制cat /var/log/mysqld.log | grep password
上面的命令会查看MySQL的日志带有password的行,在显示的结果中root@localhost:后面的部分就是默认设置的初始密码。
修改超级管理员(root)的访问口令为123456。
代码语言:javascript复制set global validate_password_policy=0;
set global validate_password_length=6;
alter user 'root'@'localhost' identified by '123456';
说明:MySQL较新的版本默认不允许使用弱口令作为用户口令,所以我们通过上面的前两条命令修改了验证用户口令的策略和口令的长度。事实上我们不应该使用弱口令,因为存在用户口令被暴力破解的风险。近年来,攻击数据库窃取数据和劫持数据库勒索比特币的事件屡见不鲜,要避免这些潜在的风险,最为重要的一点是不要让数据库服务器暴露在公网上(最好的做法是将数据库置于内网,至少要做到不向公网开放数据库服务器的访问端口),另外要保管好root账号的口令,应用系统需要访问数据库时,通常不使用root账号进行访问,而是创建其他拥有适当权限的账号来访问。
再次使用客户端工具连接MySQL服务器时,就可以使用新设置的口令了。在实际开发中,为了方便用户操作,可以选择图形化的客户端工具来连接MySQL服务器,包括:
- MySQL Workbench(官方提供的工具)
- Navicat for MySQL(界面简单优雅,功能直观强大)
- SQLyog for MySQL(强大的MySQL数据库管理员工具)
常用命令。
查看服务器版本。
代码语言:javascript复制select version();
查看所有数据库。
代码语言:javascript复制show databases;
切换到指定数据库。
代码语言:javascript复制use mysql;
查看数据库下所有表。
代码语言:javascript复制show tables;
获取帮助。
代码语言:javascript复制? contents;
? functions;
? numeric functions;
? round;
? data types;
? longblob;