相关概念说明
- 数据库(Database):按照数据结构来组织、存储和管理数据的仓库,它以一定的组织形式存于存储介质上。数据库本身不真正存储数据,真正的数据是放在数据库中的表(table)中的。
- 数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。我们熟悉的mysql、mariaDB、oracle、DB2属于DBMS
- 数据库管理员(Database administrator):负责数据库的规划、设计、协调、维护和管理等工作的
数据库存储方式:
1.网状数据库
2.层次型数据库:存在数据冗余的现象
3.关系性数据库 :目前主流 mysql、Oracle
关系性数据库:
关系 :关系就是二维表。并满足如下性质:(表中的行、列次序并不重要)
- 行row:表中的每一行,又称为一条记录
- 列column:表中的每一列,称为属性,字段
- 主键(Primary key):用于惟一确定一个记录的字段 ###是一种属性,在表格中,关联到某个字段上,这样这个字段就不能有重复数据,用于唯一数据
- 域domain:属性的取值范围,如,性别只能是‘男’和‘女’两个值 ###在表格中,限制某一字段的取值范围
主流RDBMS(relational DBMS)
- MySQL: MySQL, MariaDB, Percona Server
- PostgreSQL: 简称为pgsql, EnterpriseDB
- Oracle
- MSSQL
- DB2
数据库热度排名:
MYSQL的特性
1.插件式存储引擎:也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是MYSQL默认引擎 ###存储引擎怎么把数据存放在磁盘上,在磁盘上保存数据格式
- MyISAM ==> Aria
- InnoDB ==> XtraDB
2.单进程,多线程
3.诸多扩展和新特性
4.提供了较多测试组件
5.开源
RPM包安装MySQL
CentOS 7:安装光盘直接提供 ###光盘默认提供的数据库包默认的是mariadb;mariabd和mysql创始人是同一个人,用法基本相同,后续相关文章都是以Centos7中的mariadb示例
- mariadb-server 服务器包
- mariadb 客户端工具包
CentOS 6 ###光盘默认提供的数据库包时mysql
提高mysql安全性
运行mysql_secure_installation ###安装时自带脚本,已经放在/usr/bin/下
- 设置数据库管理员root口令
- 禁止root远程登录
- 删除anonymous用户帐号
- 删除test数据库
[root@centos7 ~]#yum -y install mariadb-server
Installed:
mariadb-server.x86_64 1:5.5.56-2.el7
Dependency Installed:
mariadb.x86_64 1:5.5.56-2.el7 ####由于依赖性,会自动的把客户端的工具给装上
perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7
perl-DBD-MySQL.x86_64 0:4.023-6.el7
Complete!
[root@centos7 ~]#systemctl start mariadb.service ###启动服务
[root@centos7 ~]#ss -ntl ###其监听的端口是tcp的3306
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:41192 *:*
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
[root@centos7 ~]#mysql
MariaDB [(none)]> help ###查看帮助,获取的客户端命令的帮助
General information about MariaDB can be found at
http://mariadb.org
List of all MySQL commands:
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.
ent.
客户端程序:
- mysql: 交互式的CLI工具 ###上述演示的是客户端的用户,不过是本机的客户端连接的是本地的服务器
- mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中
- mysqladmin:基于mysql协议管理mysqld
- mysqlimport:数据导入工具
MyISAM存储引擎的管理工具:
- myisamchk:检查MyISAM库
- myisampack:打包MyISAM表,只读
服务器端程序
- mysqld_safe
- mysqld
- mysqld_multi:多实例 ,示例: mysqld_multi –example ###多实例就是在一个服务器上安装多个相同应用;mysql默认不可以多实例,要使用多实例,就必须改配置该默认的端口号,否则冲突
用户账号
mysql用户账号由两部分组成:’USERNAME’@’HOST‘ ###限定了用户名和主机,必须同时符合要求才可以连接服务器端
说明:HOST限制此用户可通过哪些远程主机连接mysql服务器支持使用通配符: ###可以限制默认网段的主机可以连接
- % 匹配任意长度的任意字符
- 172.16.0.0/255.255.0.0 或 172.16.%.%
- _ 匹配任意单个字符
Mysql 客户端
mysql使用模式(客户端工具):
1.交互式模式:
可运行命令有两类:服务器端命令 和 客户端命令客户端命令:###通过help可以查询,命令比较少
- \h, help
- \u, use
- \s, status
- \!, system
服务器端命令:###这部分命令相对较多注意必须以;结束SQL, 需要语句结束符;
2.脚本模式:
- mysql –uUSERNAME -pPASSWORD < /path/somefile.sql ###mysql等待标准输入,可以使用重定向的方式来输入命令
- MariaDB [(none)]> source /path/from/somefile.sql ###可以先连上mysql,通过source 执行命令文件也可以;有点像shell脚本的执行方式source和\.等价
mysql命令可用选项:
- -A, –no-auto-rehash 禁止补全
- -u, –user= 用户名,默认为root
- -h, –host= 服务器主机,默认为localhost
- -p, –passowrd= 用户密码,建议使用-p,默认为空密码
- -P, –port= 服务器端口
- -S, –socket= 指定连接socket文件路径
- -D, –database= 指定默认数据库
- -C, –compress 启用压缩
- -e “SQL“ 执行SQL命令 ###可以非交互
- -V, –version 显示版本
- -v –verbose 显示详细信息
- –print-defaults 获取程序默认使用的配置
[root@centos7 ~]#mysql -u root -pcentos -e "show databases"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
修改mysql提示符:
1.[root@centos7 ~]# mysql –prompt=”(\u@\h) [\d]> ”
2.[root@centos7 ~]#vim /etc/profile.d/mysql.sh
export MYSQL_PS1=”(\u@\h) [\d]> “
3.[root@centos7 ~]#vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
prompt=(\\u@\\h) [\\d]>\\_
[root@centos7 ~]#man mysql ###搜索prompt
socket地址
服务器监听的两种socket地址:
- ip socket: 监听在tcp的3306端口,支持远程通信 ###网络走的是端口号3306
- unix sock: 监听在sock文件上, 仅支持本机通信 ###本机之间客户端和服务端是通过sock通信的/var/lib/mysql/mysql.sock:mysqld—socket—mysql
说明: host为localhost,127.0.0.1时自动使用unix sock
执行命令
运行mysql命令:默认空密码登录
- mysql>use mysql
- mysql>select user();查看当前用户
- mysql>SELECT User,Host,Password FROM user;
登录系统: mysql –uroot –p
客户端命令:本地执行
- mysql> help ###每个命令都完整形式和简写格式
- mysql> status 或 \s
服务端命令:通过mysql协议发往服务器执行并取回结果
- 每个命令都必须命令结束符号;默认为分号
- SELECT VERSION();
mysql命令历史:~/.mysql_history
服务器端配置
服务器端(mysqld):工作特性有多种配置方式
1、命令行选项:
2、配置文件: 类ini格式
集中式的配置,能够为mysql的各应用程序提供配置信息
- [mysqld]
- [mysqld_safe]
- [mysqld_multi]
- [mysql]
- [mysqldump]
- [server]
- [client]
格式: parameter = value
说明: _和- 相同; ON, TRUE意义相同; 0, OFF, FALSE意义相同
配置文件:
后面覆盖前面的配置文件,顺序如下:
- /etc/my.cnf Global选项
- /etc/mysql/my.cnf Global选项
- SYSCONFDIR/my.cnf Global选项 ###源码配置的家目录
- $MYSQL_HOME/my.cnf Server-specific 选项
- –defaults-extra-file=path ###命令指定的配置文件
- ~/.my.cnf User-specific 选项
vim /etc/my.cnf
[mysqld]
skip-networking=1 ###维护使用,只能本机使用,网络连接不了
注:关闭网络连接,只侦听本地客户端, 所有和服务器的交互都通过一个socket实现, socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改
[root@centos7s ~]#ps aux|grep mysql
mysql 3185 0.1 5.3 1766432 82488 ? Ssl 16:13 0:00 /usr/sbin/mysqld ###mysql是mysql用户运行的
root 3258 0.0 0.0 112704 972 pts/0 R+ 16:17 0:00 grep --color=auto mysql
[root@centos7s ~]#pstree -p | grep mysql ###单进程多线程的方式
|-mysqld(3185)-+-{mysqld}(3187)
| |-{mysqld}(3188)
| |-{mysqld}(3189)
| |-{mysqld}(3190)
| |-{mysqld}(3191)
| |-{mysqld}(3192)
[root@centos7 ~]# cat /etc/my.cnf ###服务器端的配置文件
[mysqld] ###带d是服务端 不带d的是客户端
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
关系型数据库的常见组件
- 数据库: database
- 表: table(行: row 列: column)
- 索引: index
- 视图: view
- 用户: user
- 权限: privilege
- 存储过程: procedure,无返回值
- 存储函数: function,有返回值
- 触发器: trigger
- 事件调度器: event scheduler,任务计划
SQL语言规范
- 在数据库系统中, SQL语句不区分大小写(建议用大写)
- SQL语句可单行或多行书写,以“;” 结尾
- 关键词不能跨多行或简写
- 用空格和缩进来提高语句的可读性
- 子句通常位于独立行,便于编辑,提高可读性
注释:
SQL标准:
- /*注释内容*/ 多行注释
- — 注释内容 单行注释,注意有空格
MySQL注释:
- #
数据库的组件(对象):
- 数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等
命名规则:
- 必须以字母开头
- 可包括数字和三个特殊字符(# _ $)
- 不要使用MySQL的保留字 如select
- 同一database(Schema)下的对象不能同名
SQL语句分类###对应的服务器端命令
DDL: Data Defination Language 数据定义语言
- CREATE, DROP, ALTER
DML: Data Manipulation Language 数据操纵语言
- INSERT, DELETE, UPDATE
DCL: Data Control Language 数据控制语言
- GRANT, REVOKE, COMMIT, ROLLBACK
DQL: Data Query Language 数据查询语言
- SELECT
数据库操作
创建数据库:
- CREATE DATABASE|SCHEMA [IF NOT EXISTS] ‘DB_NAME’;
- CHARACTER SET ‘character set name’
- COLLATE ‘collate name’
删除数据库
- DROP DATABASE|SCHEMA [IF EXISTS] ‘DB_NAME’;
查看支持所有字符集: SHOW CHARACTER SET;
查看支持所有排序规则: SHOW COLLATION;
获取命令使用帮助:mysql> HELP KEYWORD;
查看数据库列表:mysql> SHOW DATABASES; ###一般一个项目对应一个数据库
创建数据库示例:
注:创建数据库就自动创建了文件夹;数据库本身是不存放任何数据的,只是一个容器,真正存放数据的是表
MariaDB [(none)]> help create database
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name ###[IF NOT EXISTS]可选项,用来判断此数据库是否存在,若不存在才创建,防止报错
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name ###创建字符集 如utf-8,适合中文,其他的编码可能导致数据库乱码
| [DEFAULT] COLLATE [=] collation_name ###定义排序规则;字母顺序,大小写是否敏感,ASCII等等;字符集会有自己的排序规则,所以这一项不建议更改,默认就好
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.
URL: http://dev.mysql.com/doc/refman/5.5/en/create-database.html
MariaDB [(none)]> show CHARACTER SET; ###查看数据库的字符集
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 | ###默认创建的就是latin编码;所以创建数据库时一定要修改字符集模式
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | ###加强版 utf8还支持表情包,兼容性更好
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
+----------+-----------------------------+---------------------+--------+
39 rows in set (0.00 sec)
MariaDB [(none)]> create database wu CHARACTER SET utf8mb4; ###指定字符集来创建database;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show create database wu; ####可以看到创建时的字符集
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| wu | CREATE DATABASE `wu` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
[root@centos7s ~]#cd /var/lib/mysql/ ###创建数据库就自动创建了文件夹;数据库本身是不存放任何数据的,只是一个容器,真正存放数据的是表
[root@centos7s mysql]#ls
aria_log.00000001 ibdata1 ib_logfile1 mysql.sock test
aria_log_control ib_logfile0 mysql performance_schema wu
[root@centos7s mysql]#cd wu
[root@centos7s wu]#ls
db.opt
[root@centos7s wu]#cat db.opt ###通过查看opt文件也可以得知当前数据库的默认字符集以及默认排序规则
default-character-set=utf8mb4
default-collation=utf8mb4_general_ci
MariaDB [(none)]> show databases; 查看所有的数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wu |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use wu 切换数据库
Database changed
MariaDB [wu]> show tables; 查看数据库的里面的表;由于还没有创建表格,所以是空的
Empty set (0.00 sec)
MariaDB [wu]>
###########################################通过创建文件夹的方式来创建数据库################################
[root@centos7s mysql]#pwd
/var/lib/mysql
[root@centos7s mysql]#ll
total 28700
-rw-rw---- 1 mysql mysql 16384 Oct 8 09:43 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Oct 8 09:43 aria_log_control
-rw-rw---- 1 mysql mysql 18874368 Oct 8 09:43 ibdata1
-rw-rw---- 1 mysql mysql 5242880 Oct 8 09:43 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Oct 8 09:43 ib_logfile1
drwx------ 2 mysql mysql 4096 Oct 8 09:43 mysql
srwxrwxrwx 1 mysql mysql 0 Oct 8 09:43 mysql.sock
drwx------ 2 mysql mysql 4096 Oct 8 09:43 performance_schema
drwx------ 2 mysql mysql 6 Oct 8 09:43 test
[root@centos7s mysql]#cp -a test jeff
[root@centos7s mysql]#mkdir wu1
[root@centos7s mysql]#ll
total 28700
-rw-rw---- 1 mysql mysql 16384 Oct 8 09:43 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Oct 8 09:43 aria_log_control
-rw-rw---- 1 mysql mysql 18874368 Oct 8 09:43 ibdata1
-rw-rw---- 1 mysql mysql 5242880 Oct 8 09:43 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Oct 8 09:43 ib_logfile1
drwx------ 2 mysql mysql 6 Oct 8 09:43 jeff
drwx------ 2 mysql mysql 4096 Oct 8 09:43 mysql
srwxrwxrwx 1 mysql mysql 0 Oct 8 09:43 mysql.sock
drwx------ 2 mysql mysql 4096 Oct 8 09:43 performance_schema
drwx------ 2 mysql mysql 6 Oct 8 09:43 test
drwxr-xr-x 2 root root 6 Oct 8 10:16 wu1
MariaDB [(none)]> show databases; ###创建文件夹的方式也可以达到创建数据库的目的
+--------------------+
| Database |
+--------------------+
| information_schema |
| jeff |
| mysql |
| performance_schema |
| test |
| wu1 |
+--------------------+
6 rows in set (0.00 sec)
MariaDB [(none)]> show create database wu1; ###当然直接创建空文件,会采用默认的latin字符集
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| wu1 | CREATE DATABASE `wu1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]>
删除数据库示例:
MariaDB [wu]> drop database wu; ###在sql中基本都是用drop来删除;用create来创建
Query OK, 0 rows affected (0.00 sec)
[root@centos7s wu]#cd /var/lib/mysql/ ###相应的数据库目录也会被删除;其实直接删除数据库目录也可以到达删除数据库的目的
[root@centos7s mysql]#ls
aria_log.00000001 ibdata1 ib_logfile1 mysql.sock test
aria_log_control ib_logfile0 mysql performance_schema
[root@centos7s mysql]#