- 数据库基础
- 安装Mysql
- 管理数据库和表
- 用户和权限管理
- 函数和存储过程
- Mysql架构
- 存储引擎
- 服务器选项系统和状态变量
- 优化查询和索引管理
- 锁和事务管理
- 日志管理
- 备份还原
- Mysql集群
一、基础概念
【数据库发展史】
- 文件系统——使用磁盘文件来存储数据
- 第一代数据库——网状模型、层次模型
- 第二代数据库——关系型数据库和结构化查询语言
- 新一代数据库——"关系-对"型数据库
文件系统:编写应用程序不方便,数据冗余不可避免、不支持对文件的并发访问、数据间联系弱、可视化效果差、无安全控制功能】
数据库管理系统DBMS:相互关联的数据的集合、较少的数据冗余、程序域数据相互独立、数据的安全性、可靠、数据可以并发使用
【数据库管理系统】
- 数据库是数据的汇集,它以一定的组织形式存于存储介质上
- DBMS是管理数据库的系统软件,他实现数据库系统的各种功能,是数据库系统的核心
- DBA工程师:负责数据库的规划、设计、协调、维护和管理等工作
- 应用程序:指以数据库为基础的应用程序
数据库管理系统基本功能
- 数据定义:
- 数据处理:增、删、查、改
- 数据安全:
- 数据备份:还原!!!
数据库系统的架构
- 单机架构
- 大型机/终端架构
- 主从式架构(C/S):主流
- 分布式架构
【关系型数据库,(非关系型数据库,性能更好(no SQL 、not only SQL、memcached redis))】
- 关系:二维表
- 行ROW:一条记录,record记录
- 列Column:属性、字段
- 主键(Primary key):用于唯一确定一个人记录的字段
- 域(domain):属性的取值范围
1.RDBMS:
Mysql:Mysql、**mariaDB**、Percona Server
PostgreSQL:pgsql、EnterpriseDB
Oracle:
MSSQL:
DB2:
2.事务transaction:多个操作被当成一个整体对待:
ACID:
A:原子性
C:一致性
I:隔离性
D:持久性
联系类型
一对一:
一对多:
多对多:
【数据三要素】
数据结构:
数据类型、内容、性质有关的对象,比如关系型中的域、属性和关系;
与数据间联系有关的对象,它从数据组织层表达数据记录与字段的结构
数据的操作:
数据的提取:SELECT
数据的编辑:INSERT、DELETE、UPDATE
数据的约束条件:
实体(行)完整性:
域(列)完整性:
参考完整性:
【简易数据规划流程】
第一阶段:收集数据,得到字段
第二阶段:把字段分类,归入表,建立表的关联
第三阶段:规范化数据库
6种范式:
1NF:无重复的列,同一列中不能有多个值,不能有多种属性。不满足第一范式的数据库就不是关系型数据库。 2NF:属性完全依赖于主键,必须满足1NF,要求表中的每个行可以被唯一的区分。【主键、复合主键】
3NF:属性不依赖于其他属性,必须先满足2NF,第三范式要求一个数据库表中不包含一再其他表中已包含的非关键字信息,非PK的字段间不能有从属关系。
SQL概念:
Sql:Structure Query language结构化查询语句
》SQL解释器:
》数据存储协议:应用层协议,C/S
S:server,监听与套接字,接收并处理客户端的请求
C:Clent客户端接口:
GLI
GUL
编程接口:
ODBC:
JDBC:
基本概念
【索引】:将表中的一个或者多个字段中的数据复制一份另存,并且需要按特定的次序排序存储
关系运算:
选择:筛选出符合的行
投影:挑选出需要的字段
连接:表间字段的关联
【数据模型】:
【数据抽象】:
物理层:存储格式
逻辑层:DBA角度,描述存储什么数据,数据间的联系
视图层:用户角度
关系模型的分类:
关系模型:
基于对象的关系模型:
半结构化关系模型:XML文件
Mysql发展史:
1979年:TcX 公司 Monty Widenius
1996年:mysql 1.0 linux版本
1999年:Mysql AB公司,瑞典
2003年:mysql 5.0版本,视图、存储过程
2008年:Sun收购
2009年:Oracle收购Sun
2009年:Monty成立MariaDB
官方网站:
mysql:www.mysql.com
mariadb:www.mariadb.org
官方文档:
https://dev.mysql.com/doc/
https://mariadb.com/kb/en/
版本:
mysql:5.1-->5.5-->5.6-->5.7
mariadb:5.5-->10.0-->10.1-->10.2-->10.3
二、安装
【MariaDB的特性】
插件式的存储引擎:也称为表类型,存储管理器有多种实现版本,功能和特性略有差别,用户可以根据自己的需要灵活选择,mysql5.5开始innoDB引擎是mysql默认引擎。
MyISAM==>Aria
InnoDB==>XtraDB
单进程,多线程
诸多扩展和特性
较多的测试组件
开源
【安装MariaDB】
方式:
1.源代码:编译安装(难)
2.二进制格式的程序包:展开至特定的路径,简单配置后可使用(偏难)
3.程序包管理器管理的程序包(简单)Centos 7:MariaDB-server 服务器包
MariaDB 客户端工具包
centos安装光盘 项目官方:https://downloads.mariadb.org/mariadb/repositories
方式一、centos 7 yum 安装MariaDB-server
yum 安装指定的版本 从官网获取mariadb 的指定版本的yum源,添加的到yum源里,(/etc/yum.repo/mariadb.repo)
https://downloads.mariadb.org/
系统源里有旧的版本,我们添加新版本的yum源,yum install 会安装哪个版本? 新的
【阿里、清华、中科院都有相关的yum源,国内速度快】 yum install mariadb-server
【1】下载安装
[root@localhost ~]# yum install mariadb-server -y #包名
已加载插件:fastestmirror
base | 3.6 kB 00:00:00
centos-sclo-rh | 3.0 kB 00:00:00
centos-sclo-sclo | 3.0 kB 00:00:00
extras | 2.9 kB 00:00:00
mariadb | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
zabbix | 2.9 kB 00:00:00
zabbix-frontend | 2.9 kB 00:00:00
zabbix-non-supported | 951 B 00:00:00
(1/8): extras/7/x86_64/primary_db | 222 kB 00:00:26
(2/8): base/7/x86_64/primary_db | 6.1 MB 00:00:26
(3/8): centos-sclo-sclo/x86_64/primary_db | 300 kB 00:00:26
(4/8): centos-sclo-rh/x86_64/primary_db | 2.9 MB 00:00:26
(5/8): mariadb/primary_db | 51 kB 00:00:26
(6/8): zabbix/x86_64/primary_db | 58 kB 00:00:25
(7/8): updates/7/x86_64/primary_db | 4.7 MB 00:00:26
(8/8): zabbix-frontend/x86_64/primary_db | 14 kB 00:00:26
Determining fastest mirrors
* base: mirrors.aliyun.com
* centos-sclo-rh: mirrors.aliyun.com
* centos-sclo-sclo: mirrors.huaweicloud.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 mariadb-server 已经被 MariaDB-server 取代,改为尝试安装 MariaDB-server-10.1.48-1.el7.centos.x86_64
正在解决依赖关系
--> 正在检查事务
---> 软件包 MariaDB-server.x86_64.0.10.1.48-1.el7.centos 将被 安装
--> 正在处理依赖关系 MariaDB-client,它被软件包 MariaDB-server-10.1.48-1.el7.centos.x86_64 需要
--> 正在检查事务
---> 软件包 MariaDB-client.x86_64.0.10.1.48-1.el7.centos 将被 安装
--> 解决依赖关系完成
依赖关系解决
============================================================================================
Package 架构 版本 源 大小
============================================================================================
正在安装:
MariaDB-server x86_64 10.1.48-1.el7.centos mariadb 24 M
为依赖而安装:
MariaDB-client x86_64 10.1.48-1.el7.centos mariadb 10 M
事务概要
============================================================================================
安装 1 软件包 (+1 依赖软件包)
总下载量:34 M
安装大小:169 M
Downloading packages:
(1/2): MariaDB-client-10.1.48-1.el7.centos.x86_64.rpm | 10 MB 00:00:29
(2/2): MariaDB-server-10.1.48-1.el7.centos.x86_64.rpm | 24 MB 00:00:29
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总计 1.2 MB/s | 34 MB 00:00:29
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : MariaDB-client-10.1.48-1.el7.centos.x86_64 1/2
正在安装 : MariaDB-server-10.1.48-1.el7.centos.x86_64 2/2
验证中 : MariaDB-server-10.1.48-1.el7.centos.x86_64 1/2
验证中 : MariaDB-client-10.1.48-1.el7.centos.x86_64 2/2
已安装:
MariaDB-server.x86_64 0:10.1.48-1.el7.centos
作为依赖被安装:
MariaDB-client.x86_64 0:10.1.48-1.el7.centos
完毕!
【查看mysql路径】
[root@localhost ~]# which mysql
/usr/bin/mysql
【可以看出mysql是依赖于mariaDB这个包】
[root@localhost ~]# rpm -qf /usr/bin/mysql
MariaDB-client-10.1.48-1.el7.centos.x86_64
【mysql安装好以后未启动,所以没有生成sql.Sock文件】
[root@localhost ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory")
【启动mariaDB】
[root@localhost ~]# systemctl start mariadb
【查看端口】
[root@localhost ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 964/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1070/master
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 2173/zabbix_agentd
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2162/php-fpm: maste
tcp6 0 0 :::80 :::* LISTEN 2185/httpd
tcp6 0 0 :::22 :::* LISTEN 964/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1070/master
tcp6 0 0 :::10050 :::* LISTEN 2173/zabbix_agentd
tcp6 0 0 :::3306 :::* LISTEN 127877/mysqld
【mariadb初始root空密码】
[root@localhost ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.48-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
查看安装MariaDB包含的包列表
#rpm -ql MariaDB-server
启动后查看进程情况====》单进程多线程
当前数据库的基本信息,\s
数据库相关文件路径(默认,可以通过rpm -ql MariaDB-Server 查看路径)
数据存储路径-磁盘下 数据文件、sock文件(每个数据库生成一个文件夹)
一个数据库对应一个数据文件(/var/lib/mysql/) 是否可以通过复制文件夹生成数据库?
所以,可以通过拷贝文件夹或者导入文件夹进行备份/恢复 但是,不适用,因为拷贝的时候可能也会生成数据,数据不一致,拷贝也会花时间
数据库安全性
mysql_secure_installation
设置数据库管理员root密码
禁止root远程登录
删除anonymous用户账户
删除test数据库
直接使用mysql 不写用户名,默认登录root用户,拥有所有权限。----不安全
默认陌生账号都可以登录数据库,并有权限登录。-----不安全
查看数据库的默认用户信息
可以看出,root空密码、匿名账号随便登录。----不安全
所有,设置root密码、删除匿名账号,使用mysql_secure_insatllation脚本进行。(系统自带脚本)
设置root密码、删除匿名用户、禁止root远程登录、删除测试数据库
添加安全措施前VS后,
数据库的用户名=用户名@主机,
MariaDB 程序
【客户端程序】
mysql:交互式CLI攻击
mysqldump:备份工具,基于mysql协议向Mysqld发出查询请求,并将查询得到的数据转换为insert等语句保存在文本中
mysqladmin:基于mysql协议管理mysqld
mysqlimport:数据导入攻击
【MyISAM存储引擎管理工具】
myisamchk:检查MyISAM表
myisampack:打包MyISAM表,只读
【服务器端程序】
mysql_safe:
mysqld:
mysqld_multi:多实例,比如mysqld_multi —example,一个软件在一个机器上跑多份,节约成本。(测试环境)端口不重复
用户账号
mysql用户账号=“username”@“host” host 限制此用户可通过哪些远程主机连接mysql服务器
%通配符,匹配任意长度的任意字符
>10.160.1.18/2255.255.255.0 或者10.160.%.%
>_匹配任意单个字符
Mysql 客户端使用
MySQL使用模式:
【交互式模式】
可运行命令行有两类:
客户端命令:\h ,help \s,status
服务端命令:Sql,需要语句结束符;
【脚本模式,两种方式】
mysql -uroot -ppasswd1! </sqldata/test.sql
mysql > source /sqldata/test.sql
举例:
[root@localhost sqldata]# mysql -uroot -ppasswd1! -e "show databases;drop database testdb2;show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysqlclon |
| performance_schema |
| testdb |
| testdb2 |
| testdb3 |
+--------------------+
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysqlclon |
| performance_schema |
| testdb |
| testdb3 |
+--------------------+
[root@localhost sqldata]#
socket地址
服务器监听的两种socket地址:
ip socket:监听在TCP的3306 port ,支持远程通信
unix sock:监听在sock文件上,仅支持本机通信 如:/var/lib/mysql/mysql.sock host为localhost、127.0.0.1时自动使用unix sock
举例mysql的使用:
运行mysql命令:默认空密码
mysql
mysql>use mysql;
mysql>select user();查看当前用户
mysql>SELECT User,host,password from user;
登录系统:
mysql -uroot -p
客户端命令:本地执行
mysql>help 或者\h
mysql>status 或者\s
服务端命令:
通过mysql协议发往服务器执行并取回结果
每个命令都必须有命令结束符,默认分号
SELECT VERSION();
配置文件 ,路径默认
。。方式一安装结束!!
方式二:二进制包安装,centos7.3 mraiaDB 10.2.36
官网下载二进制(已经编译过的)包安装,官网提供三种安装方式对应的说明及按安装文件。
https://downloads.mariadb.org/提供源码包、二进制包、yum源
1.检查环境
iptable
selinux
mariadb-server
检查mysql用户是否已经存在
2.将下载安装好的二进制包上传到linux上
3.
【注意解压的路径要跟编译过程中指定路径一致,可在官方文档中查看、mysql数据目录的文件权限分配、mysql安装路径的文件权限、添加服务】
开始安装
#创建mysql用户,指定用户数据路径 禁止登录
useradd -r -d /data/mysqldb -s /sbin/nologin mysql
#查看mysql用户的信息
getent passwd mysql
id mysql
#解压二进制包到指定的安装路径下,安装路径在编译安装时已经指定,所以我们只能根据说明进行安装
tar -zxvf mariadb-10.2.36-linux-systemd-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ll
#软链接到mysql路劲下,官网查看得安装路劲为/usr/local/mysql
ln -s mariadb-10.2.36-linux-systemd-x86_64/ mysql
ll
#查看mysql下的文件、还有文件属性
ll mysql/
chown -R root:root mysql/
ll mysql/
ls /usr/local/mysql/bin/
echo PATH=/usr/local/mysql/bin:$PATH >/etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
echo $PATH
#创建数据库存储目录
mkdir /data/
mkdir /data/mysqldb
#查看目录的属性,更改权限
ll -d /data/mysqldb/
chown -R mysql:mysql /data/mysqldb
ll -d /data/mysqldb/
chmod 770 /data/mysqldb
ll -d /data/mysqldb/
cd mysql/
ls
#生成初始数据库,自带脚本,运行脚本生成数据库,在Scr...下
ls scripts/
pwd
#运行脚本生成数据库 指定位置 用户,一定要在/usr/local/mysql/bin下运行!!!
scripts/mysql_install_db --datadir=/data/mysqldb --user=mysql
ll /data/mysqldb/
#配置文件的位置,大、中、小
ls support-files/
cat support-files/my-small.cnf
cat support-files/my-huge.cnf
#将适合自己用的配置文件cp到/etc/my.cnf下,不要改配置文件中的路劲,特别时sock路径!!!
cp support-files/my-huge.cnf /etc/my.cnf
#修改配置文件,指定数据文件路径datadir =
vim /etc/my.cnf
#拷贝脚本作为服务启动脚本,添加为服务mysqld
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --list
chkconfig --add mysqld
chkconfig --list
#启动MySQL 并查看端口3306
service mysqld start
netstat -nltp
#设置root密码,安全加固
mysql
mysql_secure_installation
mysql -uroot -p
#安装完毕
方式二 、二进制包安装结束
方式三、源码编译安装
1.在官网下载源码包
2.安装依赖包
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel ncurses-devel gnutls-devel libxml2-devel openssl openssl-devel libevent-devel libaio-devel
3.创建用户和数据目录、安装路径(mysql为所有者,不然编译的时候我们指定了路径,但是没有权限写入文件,启动会失败)
数据库数据目录
mkdir -pv /data/mysqldb
chown mysql:mysql /data/mysqldb
安装路径目录 mkdir -pv /app/mysql
chown mysql:mysql /app/mysql
创建mysql用户
useradd -r -s /bin/false -m -d /data/mysqldb/ mysql
4.解压cmake 编译安装
tar xvf mariadb-10.2.36.tar.gz
cd mariadb-10.2.36/
cmake . \(编译选项)
-DCMAKE_INSTALL_PREFIX=/app/mysql \ #指定安装路径
-DMYSQL_DATADIR=/data/mysqldb/ \ #指定数据路径
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/app/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
#安装
make && make install
#进入安装目录下,运行脚本生成数据库初始文件
cd /app/mysql
ls scripts/
pwd
#准备环境变量
echo PATH=/usr/local/mysql/bin:$PATH >/etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
echo $PATH
#运行脚本生成数据库 指定位置 用户,一定要在/usr/local/mysql/bin下运行!!!
scripts/mysql_install_db --datadir=/data/mysqldb --user=mysql
#查看数据库文件
ll /data/mysqldb/
#置文件的位置,大、中、小(/app/mysql/bin/)
ls support-files/
cat support-files/my-small.cnf
cat support-files/my-huge.cnf
#将适合自己用的配置文件cp到/etc/my.cnf下,不要改配置文件中的路劲,特别时sock路径!!!
cp support-files/my-huge.cnf /etc/my.cnf
#修改配置文件,指定数据文件路径datadir =
vim /etc/my.cnf
#拷贝脚本作为服务启动脚本,添加为服务mysqld
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --list
chkconfig --add mysqld
chkconfig --list
#启动MySQL 并查看端口3306
service mysqld start
netstat -nltp
#设置root密码,安全加固
mysql
mysql_secure_installation
mysql -uroot -p
方式三、安装完成!
多实例,一个主机上安装多个mariaDB(yum安装为例)、源码安装及二进制安装的同理
安装mariaDB-server
yum install MariaDB-server
规划不同数据库实例的数据路径\日志路径\进程文件路径\sock文件路\配置文件\启动脚本路径
mkdir /mysqldb/{3306,3307,3308}/{etc,socket,pid,log,data,bin}
tree 查看
mysql 用户权限
chown -R mysql:mysql /mysqldb/
创建数据库文件
mysql_install_db --datadir=/mysqldb/3306/data --user=mysql
mysql_install_db --datadir=/mysqldb/3307/data --user=mysql
mysql_install_db --datadir=/mysqldb/3308/data --user=mysql
tree
原配置文件拷贝——不同实例下
cp /etc/my.cnf /mysqldb/3306/etc/
cp /etc/my.cnf /mysqldb/3307/etc/
cp /etc/my.cnf /mysqldb/3308/etc/
修改每个实例的配置文件,3套配置文件
删除最后一行
datadir=/mysqldb/{3306-8}/data
socket=/mysqldb/3306/socket/mysql.sock
port=
7. 启动脚本,3套脚本,提前准备好(可以从二进制安装路径下拷贝/usr/bin/mysqld脚本),更改三套脚本,并放在每个实例文件下
cp mysqld /mysq/{3306,3307,3308}/bin
更改脚本
vim
8.启动服务,先关闭安装好的mariadb
systemctl stop mariadb
脚本文件加权限
chmod 700 /mysqldb/{3306,3307,3308}/mysqld
启动
/mysqldb/3306/mysqld start
/mysqldb/3307/mysqld start
/mysqldb/3308/mysqld start
9.连接mysql,指定Sock路径
mysql -S /mysqldb/3308/socket/mysql.sock
10.启动成功
更新设置密码,进入数据库以后
update mysql.user set password=password("passwd1!") where user="root"
;
11.更改启动脚本,填写密码等
**MariaDB的三种安装及多实例安装全部结束!**