MySQL数据库(一)原理和MySQL安装

成功不易,加倍努力!

      • 1 数据库原理
        • 1.1 数据的时代
        • 1.2 数据库的发展史
        • 1.3 DBMS 数据库管理系统
        • 1.4 数据库管理系统的优点
        • 1.5 数据库管理系统的基本功能
        • 1.6 数据库系统的架构
        • 1.7 各种数据库管理系统
        • 1.8 关系型数据库理论
      • 2 MySQL安装和基本使用
        • 2.1 MySQL 介绍
        • 2.2 MySQL 安装
        • 2.3 初始化脚本提高安全性
        • 2.4 MySQL 组成
        • 2.5 通用二进制格式安装 MySQL
        • 2.6 实战案例:一键安装mysql-5.6二进制包的脚本
        • 2.7 实战案例:二进制安装安装MySQL 5.7
        • 2.8 实战案例:一键安装mysql-5.7 二进制包的脚本
        • 2.9 源码编译安装mariadb
        • 2.10 实战案例:CentOS 8实现MySQL的多实例
        • 2.11 实战案例:CentOS 7 实现MySQL的多实例

1 数据库原理

1.1 数据的时代

  • 涉及的数据量大
  • 数据不随程序的结束而消失
  • 数据被多个应用程序共享
  • 大数据

数据的分类

  • 结构化的数据:即有固定格式和有限长度的数据。例如填的表格就是结构化的数据,国籍:中华人民共和国,民族:汉,性别:男,这都叫结构化数据
  • 非结构化的数据:非结构化的数据越来越多,就是不定长、无固定格式的数据,例如网页,有时候非常长,有时候几句话就没了;例如语音,视频都是非结构化的数据
  • 半结构化数据:比如:XML或者HTML的格式的数据

1.2 数据库的发展史

  • 萌芽阶段:文件系统
    使用磁盘文件来存储数据
  • 初级阶段:第一代数据库
    出现了网状模型、层次模型的数据库
  • 中级阶段:第二代数据库
    关系型数据库和结构化查询语言
  • 高级阶段:新一代数据库
    “关系-对象”型数据库

文件管理系统的缺点

  • 编写应用程序不方便
  • 数据冗余不可避免
  • 应用程序依赖性
  • 不支持对文件的并发访问
  • 数据间联系弱
  • 难以按用户视图表示数据
  • 无安全控制功能

1.3 DBMS 数据库管理系统

  • 数据库:database是数据的汇集,它以一定的组织形式存于存储介质上
  • DBMS:是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心
  • DBA:负责数据库的规划、设计、协调、维护和管理等工作
  • 应用程序:指以数据库为基础的应用程序

1.4 数据库管理系统的优点

  • 相互关联的数据的集合
  • 较少的数据冗余
  • 程序与数据相互独立
  • 保证数据的安全、可靠
  • 最大限度地保证数据的正确性
  • 数据可以并发使用并能同时保证一致性

1.5 数据库管理系统的基本功能

  • 数据定义
  • 数据处理
  • 数据安全
    -数据备份

1.6 数据库系统的架构

  • 单机架构
  • 大型主机/终端架构
  • 主从式架构(C/S)
  • 分布式架构

1.7 各种数据库管理系统

1.7.1 网状数据库
MySQL数据库(一)原理和MySQL安装_第1张图片
最早出现的是网状DBMS,1964年通用电气公司的Charles Bachman成功地开发出世界上第一个网状IDS,也是第一个数据库管理系统,IDS 具有数据模式和日志的特征,只能在GE主机运行

1.7.2 层次数据库

以树型结构表示实体及其之间联系,关系只支持一对多
代表数据库:IBM IMS

1.7.3 RDBMS 关系型数据库

1.7.3.1 关系统型数据库相关概念

  • 关系 :关系就是二维表,其中:表中的行、列次序并不重要
  • 行row:表中的每一行,又称为一条记录record
  • 列column:表中的每一列,称为属性,字段,域field
  • 主键PK Primary key:用于惟一确定一个记录的字段,一张表只有一个主键
  • 域domain:属性的取值范围,如,性别只能是‘男’和‘女’两个值,人类的年龄只能0-150

1.7.3.2 常用关系数据库

  • MySQL: MySQL, MariaDB, Percona Server
  • PostgreSQL: 简称为pgsql,EnterpriseDB
  • Oracle
  • MSSQL
  • DB2
    1.7.3.3 数据库排名

https://db-engines.com/en/ranking
MySQL数据库(一)原理和MySQL安装_第2张图片

1.8 关系型数据库理论

1.8.1 实体-联系模型E-R

  • 实体Entity:客观存在并可以相互区分的客观事物或抽象事件称为实体,在E-R图中用矩形框表示实体,把实体名写在框内
  • 属性:实体所具有的特征或性质
  • 联系:联系是数据之间的关联集合,是客观存在的应用语义链
    • 实体内部的联系:指组成实体的各属性之间的联系。如职工实体中,职工号和部门经理号之间
      有一种关联关系
    • 实体之间的联系:指不同实体之间联系。例:学生选课实体和学生基本信息实体之间
    • 实体之间的联系用菱形框表示

1.8.2 联系类型

  • 一对一联系(1:1)
  • 一对多联系(1:n):外键
  • 多对多联系(m:n):增加第三张表

1.8.3 数据的操作

  • 数据提取:在数据集合中提取感兴趣的内容。SELECT
  • 数据更新:变更数据库中的数据。INSERT、DELETE、UPDATE

1.8.4 数据库规划流程

  1. 收集数据,得到字段
    收集必要且完整的数据项
    转换成数据表的字段
  2. 把字段分类,归入表,建立表的关联
    关联:表和表间的关系
    分割数据表并建立关联的优点
    节省空间
    减少输入错误
    方便数据修改
  3. 规范化数据库

1.8.5 数据库的正规化分析

数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。关系模型的发明者埃德加·科德最早提出这一概念,并于1970年代初定义了第一范式、第二范式和第三范式的概念

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,不同的规范要求被称为不同范式,各种范式呈递次规范,越高的范式数据库冗余越小

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般数据库只需满足第三范式(3NF)即可

1.8.5.1 第一范式:1NF

无重复的列,每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,确保每一列的原子性。除去同类型的字段,就是无重复的列

说明:第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库

1.8.5.2 第二范式:2NF

属性完全依赖于主键,第二范式必须先满足第一范式,要求表中的每个行必须可以被唯一地区分,通常为表加上每行的唯一标识PK,非PK的字段需要与整个PK有直接相关性

1.8.5.3 第三范式:3NF

属性不依赖于其它非主属性,满足第三范式必须先满足第二范式。第三范式要求一个数据表中不包含已在其它表中已包含的非主关键字信息,非PK的字段间不能有从属关系

1.8.6 SQL 结构化查询语言简介

SQL:结构化查询语言,Structure Query Language
SQL解释器:

数据存储协议:应用层协议,C/S

  • S:server, 监听于套接字,接收并处理客户端的应用请求
  • C:Client

客户端程序接口

  • CLI
  • GUI

应用编程接口

  • ODBC:Open Database Connectivity
  • JDBC:Java Data Base Connectivity

1.8.7 SQL 基本概念

  • 约束:constraint,表中的数据要遵守的限制
  • 主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL,一个表只能有一个
  • 惟一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL,一个表可以存在多个
  • 外键:一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据
  • 检查:字段值在一定范围内
  • 索引:将表中的一个或多个字段中的数据复制一份另存,并且按特定次序排序存储

1.8.8 关系运算

  • 选择:挑选出符合条件的行
  • 投影:挑选出需要的字段
  • 连接:表间字段的关联

1.8.9 数据抽象

  • 物理层:数据存储格式,即RDBMS在磁盘上如何组织文件
  • 逻辑层:DBA角度,描述存储什么数据,以及数据间存在什么样的关系
  • 视图层:用户角度,描述DB中的部分数据

1.8.10 关系模型的分类

  • 关系模型
  • 基于对象的关系模型
  • 半结构化的关系模型:XML数据

2 MySQL安装和基本使用

2.1 MySQL 介绍

2.1.1 MySQL 历史

1979年:TcX公司 Monty Widenius,Unireg
1996年:发布MySQL1.0,Solaris版本,Linux版本
1999年:MySQL AB公司,瑞典
2003年:MySQL 5.0版本,提供视图、存储过程等功能
2008年:Sun 花10亿美元收购MySQL
2009年:Oracle 花75亿美元收购sun
2009年:Monty成立MariaDB

2.2.2 MySQL系列

2.2.2.1 MySQL 的三大主要分支

  • mysql
  • mariadb
  • percona Server

2.2.2.2 官方网址

https://www.mysql.com/
http://mariadb.org/
https://www.percona.com

2.2.2.3 官方文档

https://dev.mysql.com/doc/
https://mariadb.com/kb/en/
https://www.percona.com/software/mysql-database/percona-server

2.2.2.4 版本演变

MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 -->8.0
MariaDB:5.5 -->10.0–> 10.1 --> 10.2 --> 10.3 --> 10.4 --> 10.5

2.2.3 MYSQL的特性

  • 插件式存储引擎:也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是MYSQL默认引擎
    MyISAM ==> Aria
    InnoDB ==> XtraDB
  • 单进程,多线程
  • 诸多扩展和新特性
  • 提供了较多测试组件
  • 开源

2.2 MySQL 安装

2.2.1 安装方式

  • 源代码:编译安装
  • 二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
  • 程序包管理器管理的程序包

2.2.2 RPM包安装MySQL

CentOS 安装光盘
项目官方:https://downloads.mariadb.org/mariadb/repositories/
国内镜像:https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/
https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/

CentOS 8:安装光盘直接提供

  • mysql-server:8.0
  • mariadb-server : 10.3.17

CentOS 7:安装光盘直接提供

  • mariadb-server:5.5 服务器包
  • mariadb 客户端工具包

CentOS 6:

  • mysql-server:5.1 服务器包
  • mysql 客户端工具包

2.3 初始化脚本提高安全性

运行脚本:mysql_secure_installation

设置数据库管理员root口令
禁止root远程登录
删除anonymous用户帐号
删除test数据库

2.4 MySQL 组成

2.4.1 客户端程序

  • mysql: 交互式的CLI工具
  • mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中
  • mysqladmin:基于mysql协议管理mysqld
  • mysqlimport:数据导入工具
  • MyISAM存储引擎的管理工具:
  • myisamchk:检查MyISAM库
  • myisampack:打包MyISAM表,只读

2.4.2 服务器端程序

  • mysqld_safe
  • mysqld
  • mysqld_multi 多实例 ,示例:mysqld_multi --example

2.4.3 用户账号

mysql用户账号由两部分组成:'USERNAME'@'HOST‘

说明

  • HOST限制此用户可通过哪些远程主机连接mysql服务器
  • 支持使用通配符:
  • % 匹配任意长度的任意字符
  • 172.16.0.0/255.255.0.0 或 172.16.%.%
  • _ 匹配任意单个字符

2.4.4 mysql 命令

2.4.4.1 mysql 运行命令类型

  • 客户端命令:本地执行,每个命令都完整形式和简写格式
mysql> \h, help
mysql> \u,use
mysql> \s,status
mysql> \!,system
  • 服务端命令:通过mysql协议发往服务器执行并取回结果,命令末尾都必须使用命令结束符号,默认为分号
#示例:
mysql>SELECT VERSION();

2.4.4.2 mysql使用模式

  • 交互式模式
  • 脚本模式:
mysql –uUSERNAME -pPASSWORD < /path/somefile.sql
cat /path/somefile.sql | mysql –uUSERNAME -pPASSWORD
mysql>source /path/from/somefile.sql

2.4.4.3 mysql命令使用格式

mysql [OPTIONS] [database]

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 获取程序默认使用的配置

登录系统:

#默认空密码登录
mysql –uroot –p

运行mysql命令:

mysql>use mysql
mysql>select user();                 查看当前用户
mysql>SELECT User,Host,Password FROM user;

范例:mysql的配置文件,修改提示符

#查看mysql版本
[root@centos8 ~]#mysql -V
mysql Ver 15.1 Distrib 10.3.11-MariaDB, for Linux (x86_64) using readline 5.1

#临时修改mysql提示符
[root@centos8 ~]#mysql -uroot -pcentos --prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"

#持久修改mysql提示符
[root@centos8 ~]#vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"

[root@centos8 ~]#mysql --print-defaults -v
mysql would have been started with the following arguments:
--prompt=\r:\m:\s(\u@\h) [\d]>\_ -v
[root@centos8 ~]#mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.3.11-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.

10:29:30(root@localhost) [(none)]> 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
10:29:34(root@localhost) [mysql]> exit

范例:配置客户端mysql的自动登录

vim/etc/my.cnf.d/client.conf
[client]
user=wang
password=centos

2.4.4.4 mysqladmin命令

mysqladmin 命令格式

mysqladmin [OPTIONS] command command....

范例:

#查看mysql服务是否正常,如果正常提示mysqld is alive
mysqladmin -uroot -pcentos ping
#关闭mysql服务,但mysqladmin命令无法开启
mysqladmin –uroot –pcentos shutdown
#创建数据库testdb
mysqladmin -uroot –pcentos create testdb
#删除数据库testdb
mysqladmin -uroot -pcentos drop testdb
#修改root密码
mysqladmin –uroot –pcentos password ‘magedu’
#日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pcentos flush-logs

2.4.4.5 服务器端配置

服务器端(mysqld):工作特性有多种配置方式
1、命令行选项:
2、配置文件:类ini格式,集中式的配置,能够为mysql的各应用程序提供配置信息

服务器端配置文件:

/etc/my.cnf #Global选项
/etc/mysql/my.cnf #Global选项
~/.my.cnf #User-specific 选项

配置文件格式:

[mysqld]
[mysqld_safe]
[mysqld_multi]
[mysql]
[mysqldump]
[server]
[client]

格式:parameter = value

说明:_和- 相同
1,ON,TRUE意义相同, 0,OFF,FALSE意义相同

2.4.4.6 socket地址

服务器监听的两种socket地址:

  • ip socket: 监听在tcp的3306端口,支持远程通信 ,侦听3306/tcp端口可以在绑定有一个或全部接口IP上
  • unix sock: 监听在sock文件上,仅支持本机通信, 如:/var/lib/mysql/mysql.sock)
    说明:host为localhost 时自动使用unix sock

2.4.4.7 关闭mysqld网络连接

只侦听本地客户端, 所有客户端和服务器的交互都通过一个socket文件实现,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改

范例:

vim /etc/my.cnf
[mysqld]
skip-networking=1

2.5 通用二进制格式安装 MySQL

2.5.1 准备用户

groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 -d /data/mysql mysql

2.5.2 准备数据目录,建议使用逻辑卷

#可选做,后面的脚本mysql_install_db可自动生成此目录
mkdir /data/mysql
chown mysql:mysql /data/mysql

#方法二:逻辑卷
fdisk /dev/sda
yum install -y lvm2  
pvcreate /dev/sda6
vgcreate vg0 /dev/sda6
lvcreate -n mysql -l 100%free vg0
mkfs.ext4 /dev/vg0/mysql #创建文件系统
vim /etc/fstab #修改配置文件,开机自动挂载
mount -a  #全部挂载
df -h		#确认挂载是否成功

2.5.3 准备二进制程序

#带有linux是编译好的,路径已经指定
tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -sv mariadb-VERSION mysql
chown -R root:root /usr/local/mysql/

2.5.4 准备配置文件

cd /usr/local/mysql
cp -b support-files/my-large.cnf /etc/my.cnf
vim /etc/my.cnf
#mysql语句块中添加以下三个选项
[mysqld]
datadir = /data/mysql   	#数据库位置
innodb_file_per_table = on  #在mariadb5.5以上版的是默认值,可不加
skip_name_resolve = on 		#禁止主机名解析,建议使用

2.5.5 创建数据库文件

cd /usr/local/mysql/
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql

[root@centos8 mysql]#ls /data/mysql/ -l
total 110604
-rw-rw---- 1 mysql mysql 12582912 Jun 1 16:44 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Jun 1 16:44 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Jun 1 16:44 ib_logfile1
drwx------ 2 mysql mysql 4096 Jun 1 16:44 mysql
drwx------ 2 mysql mysql 4096 Jun 1 16:44 performance_schema
drwx------ 2 mysql mysql 4096 Jun 1 16:44 test

2.5.6 准备服务脚本,并启动服务

cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
service mysqld start
#如果有对应的service 文件可以执行下面
cp support-files/systemd/mariadb.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable --now mariadb

2.5.7 PATH路径

echo 'PATH=/user/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh

2.5.8 安全初始化

/user/local/mysql/bin/mysql_secure_installation

2.6 实战案例:一键安装mysql-5.6二进制包的脚本

#!/bin/bash
#mysql-install.sh
DIR=`pwd`
NAME="mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz"
FULL_NAME=${DIR}/${NAME}
DATA_DIR="/data/mysql"

yum install libaio perl-Data-Dumper vim gcc gcc-c++ wget autoconf net-tools lrzsz -y
yum install curl policycoreutils openssh-server openssh-clients postfix -y

if [ -f ${FULL_NAME} ];then
	echo "安装文件存在"
else
	echo "安装文件不存在"
	exit 3
fi
if [ -h /usr/local/mysql ];then
	echo "Mysql 已经安装"
	exit 3
else
	tar xvf ${FULL_NAME} -C /usr/local/src
	ln -sv /usr/local/src/mysql-5.6.34-linux-glibc2.5-x86_64 /usr/local/mysql
	if id mysql;then
		echo "mysql 用户已经存在,跳过创建用户过程"
	else
		useradd -r -s /sbin/nologin mysql
	fi

	if id mysql;then
		chown -R mysql.mysql /usr/local/mysql/*
		if [ ! -d /data/mysql ];then
			mkdir -pv /data/mysql && chown -R mysql.mysql /data
			/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql/
			cp /usr/local/src/mysql-5.6.34-linux-glibc2.5-x86_64/support-files/mysql.server /etc/init.d/mysqld
			chmod a+x /etc/init.d/mysqld
			cp ${DIR}/my.cnf /etc/my.cnf
			ln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql 
			/etc/init.d/mysqld start
			chkconfig --add mysqld
		else
			echo "MySQL数据目录已经存在,"
			exit 3
		fi
	fi
fi

#my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1

[client]
port=3306
socket=/var/lib/mysql/mysql.sock

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mysql.pid

2.7 实战案例:二进制安装安装MySQL 5.7

2.7.1 安装相关包

yum -y install libaio numactl-libs

2.7.2 用户和组

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

2.7.3 准备程序文件

tar xf mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz –C /usr/local
cd /usr/local/
ln -s mysql-5.7.29-linux-glibc2.12-x86_64/ mysql
chown -R root.root /usr/local/mysql/

2.7.4准备环境变量

echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh

2.7.5 准备配置文件

cp /etc/my.cnf{,.bak}
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock

2.7.6 生成数据库文件,并提取root密码

mysqld --initialize --user=mysql --datadir=/data/mysql
...省略...
2019-07-04T13:03:54.258140Z 1 [Note] A temporary password is generated for
root@localhost: LufavlMka6,! #注意生成root的初始密码

grep password /data/mysql/mysql.log
2019-12-26T13:31:30.458826Z 1 [Note] A temporary password is generated for
root@localhost: LufavlMka6,!
awk '/temporary password/{print $NF}' /data/mysql/mysql.log
LufavlMka6,!

2.7.7 准备服务脚本和启动

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start

2.7.8 修改口令

mysqladmin -uroot -p'LufavlMka6,!' password magedu

2.7.9 测试登录

mysql -uroot -pmagedu

2.8 实战案例:一键安装mysql-5.7 二进制包的脚本

#!/bin/bash
. /etc/init.d/functions
SRC_DIR=`pwd`
MYSQL='mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz'
COLOR='echo -e \E[01;31m'
END='\E[0m'
MYSQL_ROOT_PASSWORD=magedu

check (){

if [ $UID -ne 0 ]; then
	action "当前用户不是root,安装失败" false
	exit 1
fi

cd $SRC_DIR
if [ ! -e $MYSQL ];then
	$COLOR"缺少${MYSQL}文件"$END
	$COLOR"请将相关软件放在${SRC_DIR}目录下"$END
	exit
elif [ -e /usr/local/mysql ];then
	action "数据库已存在,安装失败" false
	exit
else
	return
fi
}

install_mysql(){
	$COLOR"开始安装MySQL数据库..."$END
	yum -y -q install libaio numactl-libs ncurses-compat-libs libncurses.so.5 &> /dev/null
	cd $SRC_DIR
	tar xf $MYSQL -C /usr/local/
	MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
	ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
	chown -R root.root /usr/local/mysql/
	id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; }
	
	echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
	. /etc/profile.d/mysql.sh
	cat > /etc/my.cnf <<EOF
[mysqld]
server-id=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
	mysqld --initialize --user=mysql --datadir=/data/mysql
	cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
	chkconfig --add mysqld
	chkconfig mysqld on
	service mysqld start
	[ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
	MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
	mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
	action "数据库安装完成"
}

check
install_mysql

2.9 源码编译安装mariadb

建议:内存4G以上

2.9.1 安装相关依赖包

yum -y install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel

2.9.2 做准备用户和数据目录

useradd -r -s /sbin/nologin -d /data/mysql mysql

2.9.3 准备数据库目录

mkdir /data/mysql
chown mysql.mysql /data/mysql

2.9.4 源码编译安装

编译安装说明

利用cmake编译,而利用传统方法,cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译

编译选项:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

2.9.4.1 下载并解压缩源码包

tar xvf mariadb-10.2.18.tar.gz

2.9.4.2 源码编译安装mariadb

cd mariadb-10.2.18/
cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-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=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

make && make install

提示:如果出错,执行rm -f CMakeCache.txt

2.9.5 准备环境变量

echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh

2.9.6 生成数据库文件

cd /app/mysql/
scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql

2.9.7 准备配置文件

cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf

2.9.8 准备启动脚本,并启动服务

cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start

2.9.9 安全初始化

mysql_secure_installation

2.10 实战案例:CentOS 8实现MySQL的多实例

2.10.1 实验目的

CentOS 8 yum安装mariadb-10.3.17并实现三个实例

2.10.2 环境要求

一台系统CentOS 8.X主机

2.10.3 前提准备

关闭SElinux
关闭防火墙
时间同步

2.10.4 实现步骤

2.10.4.1 安装mariadb

[root@centos8 ~]#yum install mariadb-server

2.10.4.2 准备三个实例的目录

[root@centos8 ~]#mkdir -pv
/mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}
[root@centos8 ~]#chown -R mysql.mysql /mysql
[root@centos8 ~]#tree -d /mysql/
/mysql/
├── 3306
│ 	├── bin
│ 	├── data
│ 	├── etc
│ 	├── log
│   ├── pid
│	└── socket
├── 3307
│ 	├── bin
│ 	├── data
│ 	├── etc
│ 	├── log
│ 	├── pid
│ 	└── socket
└── 3308
	├── bin
	├── data
	├── etc
	├── log
	├── pid
	└── socket

21 directories

2.10.4.3 生成数据库文件

[root@centos8 ~]#mysql_install_db --datadir=/mysql/3306/data --user=mysql
[root@centos8 ~]#mysql_install_db --datadir=/mysql/3307/data --user=mysql
[root@centos8 ~]#mysql_install_db --datadir=/mysql/3308/data --user=mysql

2.10.4.4 准备配置文件

[root@centos8 ~]#vim /mysql/3306/etc/my.cnf
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid

#重复上面步骤设置3307,3308

2.10.4.5 准备启动脚本

[root@centos8 ~]#vim /mysql/3306/bin/mysqld
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd="magedu"
cmd_path="/usr/bin"
mysql_basedir="/mysql"
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

[root@centos8 ~]#chmod +x /mysql/3306/bin/mysqld
#重复上述过程,分别建立3307,3308的启动脚本

2.10.4.6 启动服务

[root@centos8 ~]#/mysql/3306/bin/mysqld start
[root@centos8 ~]#/mysql/3307/bin/mysqld start
[root@centos8 ~]#/mysql/3308/bin/mysqld start
[root@centos8 ~]#ss -ntl
State      Recv-Q       Send-Q              Local Address:Port             Peer Address:Port             
LISTEN     0            128                       0.0.0.0:22                    0.0.0.0:*               
LISTEN     0            128                          [::]:22                       [::]:*         
LISTEN     0            80                              *:3306                        *:*         
LISTEN     0            80                              *:3307                        *:*             
LISTEN     0            80                              *:3308                        *:* 

2.10.4.7 登录实例

[root@centos8 ~]#/mysql/3308/bin/mysqld start
#两种连接方法
[root@centos8 ~]#mysql -h127.0.0.1 -P3308
[root@centos8 ~]#mysql -uroot -S /mysqldb/3306/socket/mysql.sock
#确认连接的端口
MariaDB [(none)]> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> 

#关闭数据库,需要手动输入root的密码
[root@centos8 ~]#/mysql/3308/bin/mysqld stop
Stoping MySQL...
Enter password:
[root@centos8 ~]#/mysql/3308/bin/mysqld start
Starting MySQL...

2.10.4.8 修改root密码

#加上root的口令
[root@centos8 ~]#mysqladmin -uroot -S /mysql/3306/socket/mysql.sock password
'magedu'
[root@centos8 ~]#mysqladmin -uroot -S /mysql/3307/socket/mysql.sock password 
'magedu'
[root@centos8 ~]#mysqladmin -uroot -S /mysql/3308/socket/mysql.sock password 
'magedu'

#或者登录mysql,执行下面也可以
Mariadb>update mysql.user set password=password(“centos”) where user=’root’;
Mariadb>flush privileges;
#重复步骤,分别修改别外两个实例3307,3308对应root口令

2.10.4.9 测试连接

[root@centos8 ~]#mysql -uroot -p -S /mysql/3306/socket/mysql.sock #提示输入口令才能登录

2.11 实战案例:CentOS 7 实现MySQL的多实例

2.11.1 实验目的

CentOS 7.7 yum安装mariadb并实现三个实例

2.11.2 环境要求

一台主机
系统:CentOS 7.X

2.11.3 前提准备

关闭SElinux
关闭防火墙
时间同步

2.11.4 实现步骤

2.11.4.1 安装mariadb

yum install mariadb-server
Systemctl start mariadb

2.11.4.2 准备三个实例的目录

mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}
chown -R mysql.mysql /mysql

2.11.4.3 生成数据库文件

mysql_install_db --datadir=/mysql/3306/data --user=mysql
mysql_install_db --datadir=/mysql/3307/data --user=mysql
mysql_install_db --datadir=/mysql/3308/data --user=mysql

2.11.4.5 准备启动脚本

cp /etc/my.cnf /mysql/3306/etc/
vim /mysql/3306/etc/my.cnf
[mysqld]
#加此行,如果port是3306可省略此行
port=3306
datadir=/mysql/3306/data/
socket=/mysql/3306/socket/mysql.sock
[mysqld_safe]
log-error=/mysql/3306/log/mariadb.log
pid-file=/mysql/3306/pid/mariadb.pid
#重复上面步骤设置3307,3308

2.11.4.4 准备配置文件

vim /mysql/3306/bin/mysqld
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd="magedu"
cmd_path="/usr/bin"
mysql_basedir="/mysql"
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
#重复上述过程,分别建立3307,3308的启动脚本

2.11.4.6 启动关闭服务

/mysql/3306/bin/mysqld start
/mysql/3307/bin/mysqld start
/mysql/3308/bin/mysqld start

2.11.4.7 登录实例

/mysql/3306/bin/mysqld start
mysql -uroot -S /mysql/3306/socket/mysql.sock
mariadb>show variables like ‘port’ #确认连接的端口

2.11.4.8 修改root密码

mysqladmin -uroot -S /mysql/3306/socket/mysql.sock password 'magedu' #加上新口令
#或者登录mysql,执行下面也可以
Mariadb>update mysql.user set password=password(“centos”) where user=’root’;
Mariadb>flush privileges;
#重复步骤,分别修改别外两个实例3307,3308对应root口令

2.11.4.9 测试连接

mysql -uroot -S /mysql/3306/socket/mysql.sock –p #提示输入口令才能登录

你可能感兴趣的:(MySQL)