[Linux]Day29-20180604【初识MySQL数据库、安装MariaDB的三种方式】

[Linux]Day29-20180604
初识MySQL数据库

预览
关系型数据库基础
安装MySQL的各种方法
管理数据库的内容(日常常用)
安全管理:设置权限
SQL语言:函数、存储过程、触发器
了解MySQL数据库的架构:多存储引擎
数据库的各种选项(重要)
性能优化:索引
事务管理:锁
日志功能:支持还原到指点时间点
备份还原(重要)
MySQL集群:主从备份

数据库的定义:数据的集合,以文件形式存放
RAW:裸磁盘

数据库的发展史
萌芽阶段:文件系统方式
明显缺点:
(1)需要一定的规范
(2)需要分析文本内容的格式
(3)会消耗大量精力在分析文本内容格式上,而不是数据本身(舍本逐末)
(4)不支持并发访问
(5)文件权限无法控制文件内容的权限分层
初级阶段:网状数据库
出现了网状结构、层次结构
中级阶段:关系型数据库
最明显特征:二维表(横行纵列)
高级阶段:面向对象数据库

DBMS:DatabaseManagermentSystem数据库管理系统
数据和程序相独立
会以与程序相匹配的格式来存放数据文件
可以在数据库上加精确权限,实现非常灵活的安全管理
日志功能:支持还原,更加可靠
增加约束,限制用户输入数据的范围
DBA:DatabaseAdministrator数据库管理员
规划、设计、维护、管理
通过应用程序来访问数据库

DBMS的基本功能
数据的定义
应该以何种形式来存储数据
数据的处理
如何对数据做增删改查操作
数据的安全
权限控制
数据的备份
非常重要的操作!!!

数据库系统的架构
单机架构
大型主机终端架构
主从架构(C/S)
缺点:服务器性能存在系统瓶颈
分布式架构
每个服务器承担一部分负载

非关系型数据库:Not Only SQL
基于K/V值:memcached、redis
基于文档型:mongodb

关系型数据库的相关概念
关系:表与表之间存在一定的联系
行row:记录record
列column:字段field、域、属性
主键(Primary Key):是一个属性,作用在表的某个列上,这个列上的所有记录不能重复,避免表中存在重复记录
域domain:一个列的取值范围

主流的关系型数据库
MySQL分支
MySQL
MariaDB
Percona Server
PostgreSQL分支
EnterpriseDB
Oracle
MSSQL
DB2

事务transaction
多个动作当作一个整体来对待
ACID特性
A:原子性,不可分割
C:一致性,保持总数据(总帐)时时刻刻不变
I:隔离性:多个事务相互隔离,不会看到事务结束前的脏数据
D:持久性:事务结束后的数据会永久保存
支持回滚rollback
事务结束之前存在脏数据

“实体-联系”模型:E-R【了解】
实体Entity
属性
联系:数据的关联
实体内的联系:同一个表内部的数据之间存在关联
实体间的联系

联系类型
一对一联系
一对多联系
多对多联系

外键Foreign Key
一张表的字段通过另一张表的字段来获取
外键约束:不允许出现另一张表中不存在的字段
用来实现一对多的关系
主键Primary Key
避免表中的记录出现重复
只能有一个
不允许为空:NULL
唯一键Uniq Key
可以有多个
保证每条记录不会出现重复记录
允许为空:NULL
复合主键
由多个字段共同组成一个主键

多张表联合:实现多对多联系
主键表
外键表

数据三要素
数据结构
数据的类型、内容
数据之间的联系
数据的操作
增删改查
数据的约束条件
设置限制性保证数据的完整性、合法性
(1)(行)实体完整性:主键、唯一键
(2)(列)域完整性
(3)参考完整性:外键

简易数据规划流程
第一阶段:收集数据
需要确定字段的数据类型
第二阶段:把字段分类,归入不同的表,建立表与表之间的关联
第三阶段:规范化
主键、唯一键、约束
保证数据库不出现重复数据,节约存储空间

设计范式
设计规则
目的:减少数据库冗余
主流范式
1NF
无重复的列,是关系型数据库的基本要求
2NF
属性完全依赖于主键
复合主键
3NF
属性不依赖于其他非主属性
某些场景下:范式是用来打破的;目的是减少查询复杂度,提高性能

SQL概念
Structure Query Language:结构化查询语言
只关注要得到的数据,不关心数据在磁盘上保存的格式(数据在磁盘上的操作过程)
Server服务器
IP+port=socket:套接字
TCP3306:MySQL
TCP1521:Oracle
TCP1433:MSSQL
Client客户端
客户端程序接口
CLI
GUI
API应用编程接口
ODBC:Open Database Connectivity
JDBC:Java Database Connectivity
基本概念
约束constaint:表中的数据要遵守的限制
全表扫描:从头到尾做完整查询
索引:类似于书的目录
代价:占用一部分空间
关系运算
选择:挑选出特定的记录
投影:挑选特定的字段
连接:表间字段的联系

数据模型
数据抽象
物理层
数据库的数据和日志分开存放
逻辑层
DBA角度
数据之间的关联
视图层
用户角度
抽取数据库中的部分数据,只能看到希望被看到的数据
关系模型的分类
关系模型
基于对象的关系模型
半结构化的关系模型:xml格式、json格式

MySQL特点
开源免费
成熟:满足大部分企业的需求
MariaDB:属于MySQL分支

MySQL下载
Community
Bundle:集成版,Server工具与Client工具集成在一起

MariaDB下载
http://mariadb.org

官方文档
https://dev.mysql.com/doc/
https://mariadb.com/kb/en/

版本
CentOS6:MySQL 5.1
CnetOS7:MariaDB 5.5

MariaDB特性
插件式存储引擎,默认是InnoDB
单进程,多线程

安装MariaDB
yum
二进制格式的程序包:展开至特定路径,简单配置后
源码编译:cmake


CentOS6的MySQL 5.1
用户数据库:/var/lib/mysql
```bash
chkconfig --list mysql
service mysqld start
chkconfig
ss -ntl # 3306端口已经开启
rpm -qf /usr/bin/mysql # 查看mysql客户端工具来自哪个rpm包
mysql # 进入交互式客户端
```


CnetOS7的MariaDB 5.5
用户数据库:/var/lib/mysql
```bash
yum install mariadb-server
rpm -q --scripts mariadb-server
```


默认以root登录,而且不用输密码!
默认情况下无法远程登录mysql


交互式客户端工具的命令用法
```mysql
show databases # 查看已经存在的数据库
system hostname; # 可以执行Linux命令
\! hostname;

use mysql; # 切换进到mysql数据库
status; # 查看当前状态信息
\s;

show tables;
select user,password,host from user;
create database testdb;
drop database mysqlclone;
select VERSION(); # 显示数据库程序版本
```


增强安全:删除匿名账号anonymous user
```bash
mysql_secure_installation
```

mysql的用户名组成部分
用户名@主机名
root@localhost
主机名支持通配符
%
_


mysql -uroot -p -h192.168.30.7
-u:指定登录账户
-p:使用密码
-h:远程登录


客户端工具
mysql:交互式CLI
mysqldump:备份
mysqladmin:管理工具,可以改密码
mysqlimport:数据导入
服务器端程序
mysqld_saft
mysqld
mysqld_multi:实现多实例

两种执行方法
输入重定向
sql脚本

命令的分类
客户端命令:末尾不需要加分号
服务器端命令:末尾需要加分号来标识

客户端配置文件修改提示符
vim /etc/mysql.d/mysql-client.cnf
```
[mysql]
prompt=(\\u@\\h) [\\d]>\\_
```
vim /etc/profile.d/mysql.sh
```
export PS1
```

mysql客户端可用选项
-A:禁止不全
-u:指定登录用户身份
-p:使用登录密码
-h:指定远程主机
-D:指定默认数据库
-e:使用多条sql命令
-v:显示版本
-S

socket文件:适合同一台主机两个程序间通讯

服务器端配置文件
/etc/my.cnf
/etc/my.cnf.d/*.cnf
格式:parameter=value

vim /etc/my.cnf.d/*.cnf

```
[mysqld]
skip-networking=1
```
服务器端配置文件生效顺序


mysqld二进制程序的所在位置
/bin/libexec/mysqld


安装MariaDB 10.2.15 Stable
https://downloads.mariadb.org/
For best results with RPM packages, use the [Repository Configuration Tool](https://downloads.mariadb.org/mariadb/repositories/).
通过更新repo来实现
```
# MariaDB 10.2 CentOS repository list - created 2018-06-04 08:12 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```
```bash
sudo yum install MariaDB-server MariaDB-client
```


实验:(CentOS7.4)二进制安装mariaDB10.2.15
一、检查环境
1、清空iptables
2、关闭selinux
3、卸载已经存在的mariadb-server
二、创建环境
1、创建用户并指定家目录
useradd -r -d /data/mysqldb -s /sbin/nologin mysql
# -r 是系统账号,不会自动创建家目录
getent passwd mysql
2、创建程序安装路径:/usr/local/mysql
cd /usr/local
tar -zxvpf ~/mariadb-10.2.15-linux-x86_64.tar.gz
3、创建软链接
ln -s mariadb-10.2.15-linux-x86_64 mysql
cd mysql
./scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
3、更改环境变量
echo "PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh
三、创建逻辑卷

四、解压缩、安装数据库

五、生成配置文件
覆盖原有的服务器配置文件/eytc/my.cnf

六、启动脚本

实验:源码编译安装mariadb-10.2.15
一、下载源码包

二、安装编译依赖

三、创建用户


多实例:在一个虚拟机上跑多个MySQL,每个服务使用连续的不同端口(3306、3307、3308)
/usr/bin/mysql_multi
局限:只能实现相同版本的多实例

实验:基于yum安装实现多实例
一、通过yum安装

二、规划目录结构

三、生成数据库

四、拷贝配置文件

五、修改配置文件
????
六、覆盖系统自带配置文件

七、将启动脚本复制到各自的目录下

启动脚本mysqld
```bash
#!/bin/bash

port=3306
mysql_user="root"
mysql_pwd="cenos"
cmd_path="/usr/bin"
mysql_basedir="/mysqldb"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
else
printf "MySQL is running...\n"
exit
fi
}


function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}


function_restart_mysql()
{
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}

case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
```

八、加执行权限

九、更新数据库口令
select user,host,password from mysql.user;
update mysql.user set password=password("centos") where user='root'; # 使用password函数修改口令,所以口令是加密的
flush privileges;

十、设置读写权限
setfacl -R -m u:mysql:rwx /app/mysql/

猜你喜欢

转载自www.cnblogs.com/GymUManAlvin/p/9135169.html