MySQL数据库-简介与安装

MySQL 介绍和安装部署

1. 什么是数据库

1.1 简介

data base
数据 介质

1.2 什么是数据

一般认为:
文字,图片,视频,表格,用户名,密码。。。。。。
计算机认为:
01010101010

1.3 什么是介质

txt ,word , excel , ppt …notepad++ ,DBMS(数据库管理系统)

1.4 DBMS 数据库管理系统
1.4.1 作用

业务中关键型的数据,通常会使用DBMS软件进行数据的存储和管理

1.4.2 DBMS类型

RDBMS : Oracle , MySQL ,MSSQL ,PG
NoSQL : MongoDB , ES ,Redis
云数据库: RDS系列 , PolarDB , TDSQL
NewSQL : Spanner , TIDB , 国产的。。。

2. MySQL 企业版本选择

2.1 MySQL 多厂家支持

Oracle MySQL
Percona MySQL
MariaDB
云厂商 :RDS , TDSQL
美团
爱可生
Pincap

2.2 Oracle MySQL 产品线

社区版 : 开源版
企业版 : 收费版
集群版 : 几乎没人用

2.3 Oracle MySQL企业版本选择

5.6 :第二名, 5.6.34+ 以上的双数版
5.7 :第一名, 5.7.20+ 以上的双数版
8.0 :第三名, 8.0.11+ 以上的版本,建议 8.0.17以后版本

3.手撕MySQL 5.7.28 二进制版本安装

3.1 环境准备
3.1.1 创建目录
[root@db01 ~]# mkdir -p /data/app/ /data/3306/data  /data/3306/binlog
3.1.2 创建MySQL相关用户、组
[root@db01 ~]# useradd mysql
[root@db01 ~]# chown -R mysql.mysql /data
3.1.3 系统残留清空
[root@db01 ~]# yum remove mariadb-libs -y
3.2 软件上传和解压
cd /data/app 
[root@db01 app]# tar xf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 
[root@db01 app]# ln -s mysql-5.7.28-linux-glibc2.12-x86_64 mysql
[root@db01 app]# chown -R mysql. /data
3.3 环境变量设置
vim /etc/profile
#添加一行: 
export PATH=/data/app/mysql/bin:$PATH 

# 生效配置
source /etc/profile
# 检查设置
[root@db01 bin]# mysql -V
mysql  Ver 14.14 Distrib 5.7.28, for linux-glibc2.12 (x86_64) using  EditLine wrapper
3.4 准备基础配置文件
cat >/etc/my.cnf <<EOF 
[mysqld]
user=mysql
basedir=/data/app/mysql 
datadir=/data/3306/data
server_id=6
socket=/tmp/mysql.sock 
[client]
socket=/tmp/mysql.sock
EOF
3.5 初始化数据
# 5.7 + 版本 : 
[root@db01 bin]# mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3306/data

#########报错###############
mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
[root@db01 bin]# 
########################
# 报错处理: 
[root@db01 bin]# yum install -y libaio-devel

再次运行初始化命令
[root@db01 bin]# mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3306/data
2020-03-13T03:33:34.530498Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-03-13T03:33:34.923532Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-03-13T03:33:35.000129Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-03-13T03:33:35.061644Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 6b64f882-64db-11ea-88a1-000c29248f69.
2020-03-13T03:33:35.065248Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-03-13T03:33:36.340554Z 0 [Warning] CA certificate ca.pem is self signed.
2020-03-13T03:33:36.603604Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.


+++++++++++++++++报错++++++++++++++++++++++
[root@db01 bin]# mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3306/data
2020-03-13T03:35:50.039977Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-03-13T03:35:50.043386Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2020-03-13T03:35:50.043441Z 0 [ERROR] Aborting

[root@db01 bin]# 

处理方法: 清空datadir目录下所有数据,重新初始化。
!!!!!!生产需要详细确认。!!!!!!!!!!
+++++++++++++++++++++++++++++++++++++++++
3.6 准备启动脚本

方法一: 自带脚本(适合于单机单MySQL)

[root@db01 ~]# cp /data/app/mysql/support-files/mysql.server /etc/init.d/mysqld
启动方式 1: SYS-V (C6服务管理方式)
[root@db01 ~]# service mysqld start /stop /restart
[root@db01 ~]# service mysqld start 
Starting MySQL.Logging to '/data/3306/data/db01.err'.
 SUCCESS! 
[root@db01 ~]# service mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@db01 ~]# service mysqld restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL. SUCCESS! 
[root@db01 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 


启动方式2: C7 管理方式 systemd
[root@db01 ~]# chkconfig --add mysqld
[root@db01 ~]# systemctl stop mysqld
[root@db01 ~]# systemctl start mysqld
[root@db01 ~]# systemctl restart mysqld

方法二: 手工定制(单机多实例的模式)

vim /etc/systemd/system/my.service 
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/data/app/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

# 注意: 
需要将之前启动过的mysql用老的方式关闭掉。再启动。
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@db01 ~]# systemctl start my.service
3.7 小彩蛋 初始化命令的介绍
在 5.7+ 版本中 : 
方法1: 
mysqld --initialize-insecure --user=  --basedir= --datadir= 
提示: 
root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

特点: 
1. 空密码的管理员用户。
2. 密码复杂度低。

方法2: 
mysqld --initialize  --user=  --basedir= --datadir= 
A temporary password is generated for root@localhost: jwhscLjji5<3
[root@db01 data]# 

特点: 
1. 管理员用户生成默认密码,12位,4种复杂度。
2. 临时密码不能用来管理数据库,第一次登陆前改掉它。

# 5.7 以前版本初始化方式
/data/app/mysql/scripts/mysql_install_db  --user=  --basedir= --datadir= 

基础管理

1. 安全管理

1.1 用户管理

#Linux中用户
登录系统
管理系统对象
#MySQL 用户
登陆MySQL
管理MySQL的对象

1.1.2 用户的命名

#Linux 中
字符串代表用户
#MySQL 中
用户名@‘白名单’
白名单?
定义的是允许登陆数据库的IP列表。

白名单支持的方式:
###oldboy@‘localhost’ # 允许本地的oldboy用户登陆数据库
oldboy@‘10.0.0.2’ # 允许10.0.0.2地址上的oldboy用户登陆数据库
###oldboy@‘10.0.0.%’ # 允许10.0.0.0/24网段的地址oldboy用户登陆数据库
###oldboy@‘10.0.0.0/255.255.254.0’ # 允许10.0.0.0/23网段的地址oldboy用户登陆数据库
###oldboy@‘10.0.0.5%’ # 允许10.0.0.50-59
oldboy@’%’ # 允许所有IP地址链接
oldboy@‘db01’ # 允许db01主机名的地址登陆

1.1.3 用户管理

# 查询用户
mysql> select user,host ,authentication_string from mysql.user;
±--------------±----------±------------------------------------------+
| user | host | authentication_string |
±--------------±----------±------------------------------------------+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
±--------------±----------±------------------------------------------+
# 创建用户
mysql> create user oldguo@‘10.0.0.%’ identified by ‘123’;
mysql> create user oldboy@‘localhost’ identified by ‘123’;

# 删除用户
mysql> drop user oldboy@‘localhost’;

# 修改用户密码
mysql> alter user oldguo@‘10.0.0.%’ identified by ‘123456’;

管理员密码忘记的处理
[root@db01 ~]# mysql -uroot -pasdfasdfasdf
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
(1)停数据库
[root@db01 ~]# /etc/init.d/mysqld stop
(2)“单用户”模式启动数据库
service mysqld start --skip-grant-tables --skip-networking 
或者:
mysqld_safe --skip-grant-tables --skip-networking &
(3)登陆数据库改密码 
mysql> alter user root@'localhost' identified by '123';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> flush privileges ;
Query OK, 0 rows affected (0.01 sec)

mysql> alter user root@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

(4)重启数据库到正常模式
[root@db01 ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

[root@db01 ~]# mysql -uroot -p123
1.2 权限管理
1.2.0
GRANT  权限   ON  权限范围  TO 用户  IDENTIFIED BY '密码';
8.0以前版本:
GRANT  权限   ON  权限范围  TO 用户  IDENTIFIED BY '密码';
功能:
	1. 创建用户 
	2. 授权

8.0 以后注意: Grant 命令只是授权命令,不能进行建用户和改密码。
语法变为了: 
GRANT  权限   ON  权限范围  TO 用户 ,不支持改密码。

8.0 以后密码方面的“坑”。
密码验证方式从Native 换成了sha2插件。
1.2.1 权限定义
ALL : 以下列表中除了 Grant option 所有权限 
Create,Delete,Insert ,....

mysql> show privileges;
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege               | Context                               | Comment                                               |
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Alter                   | Tables                                | To alter the table                                    |
| Alter routine           | Functions,Procedures                  | To alter or drop stored functions/procedures          |
| Create                  | Databases,Tables,Indexes              | To create new databases and tables                    |
| Create routine          | Databases                             | To use CREATE FUNCTION/PROCEDURE                      |
| Create temporary tables | Databases                             | To use CREATE TEMPORARY TABLE                         |
| Create view             | Tables                                | To create new views                                   |
| Create user             | Server Admin                          | To create new users                                   |
| Delete                  | Tables                                | To delete existing rows                               |
| Drop                    | Databases,Tables                      | To drop databases, tables, and views                  |
| Event                   | Server Admin                          | To create, alter, drop and execute events             |
| Execute                 | Functions,Procedures                  | To execute stored routines                            |
| File                    | File access on server                 | To read and write files on the server                 |
| Grant option            | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess   |
| Index                   | Tables                                | To create or drop indexes                             |
| Insert                  | Tables                                | To insert data into tables                            |
| Lock tables             | Databases                             | To use LOCK TABLES (together with SELECT privilege)   |
| Process                 | Server Admin                          | To view the plain text of currently executing queries |
| Proxy                   | Server Admin                          | To make proxy user possible                           |
| References              | Databases,Tables                      | To have references on tables                          |
| Reload                  | Server Admin                          | To reload or refresh tables, logs and privileges      |
| Replication client      | Server Admin                          | To ask where the slave or master servers are          |
| Replication slave       | Server Admin                          | To read binary log events from the master             |
| Select                  | Tables                                | To retrieve rows from table                           |
| Show databases          | Server Admin                          | To see all databases with SHOW DATABASES              |
| Show view               | Tables                                | To see views with SHOW CREATE VIEW                    |
| Shutdown                | Server Admin                          | To shut down the server                               |
| Super                   | Server Admin                          | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.   |
| Trigger                 | Tables                                | To use triggers                                       |
| Create tablespace       | Server Admin                          | To create/alter/drop tablespaces                      |
| Update                  | Tables                                | To update existing rows                               |
| Usage                   | Server Admin                          | No privileges - allow connect only                    |
+-------------------------+---------------------------------------+-------------------------------------------------------+
1.2.2 权限范围
chmod -R  777  /
chmod -R  777  /oldboy 
chmod -R  777  /oldboy/t1

*.*          : 管理员    全库级别
oldboy.*     :普通用户  单库级别
oldboy.t1    :不常用    单表级别
列           :不常用    单列级别

1.2.3 授权管理
# 授权例子 : 
# 1. 授权一个管理员用户 
grant all on *.* to adm_oldguo@'10.0.0.5%' identified by 'OldGuo@123.Com' with grant option;

# 2. 授权一个业务用户wp_user1用户可以通过10.0.0.% 操作wordpress库下所有表
grant select ,insert ,update, delete on wordpress.*  to wp_user1@'10.0.0.%' identified by 'Wpuser@123.Com';

# 回收权限
注意: MySQL中 修改权限,不能重复授权。所有授权都是相加关系。所以需要回收权限。
mysql> revoke delete on wordpress.* from wp_user1@'10.0.0.%';


# 3. 查看授权 
mysql> show grants for wp_user1@'10.0.0.%';

# 4. 彩蛋 我们的权限都存在哪里呢?
授权表?
user         : 存储用户信息 + 全库级别的权限
db           :  用户针对单库级别的权限 
tables_priv  : 针对表级别的权限
columns_priv : 针对列级别的权限
procs_priv   : 
proxies_priv :

2. MySQL 的连接管理

2.1 自带客户端程序
 mysql 命令 
2.1.1 连接方式(协议)

# 本地 socket 方式登陆


前提: 需要提前准备能够通过localhost登陆的用户。例如: oldguo@'localhost'
# 1. 授权本地用户
mysql> grant all on *.* to oldguo@'localhost' identified by '123';
# 2. 连接测试 
mysql> select @@socket;
+-----------------+
| @@socket        |
+-----------------+
| /tmp/mysql.sock |
+-----------------+
1 row in set (0.00 sec)

[root@db01 ~]# mysql -uoldguo -p123 -S /tmp/mysql.sock

# 远程 TCP/IP 方式登陆

# 前提: 必须要提前授权远程连接的用户。例如:hui@'10.0.0.%'
# 1. 授权远程用户
mysql> grant all on *.* to 	hui@'10.0.0.%' identified by '123';
# 2. 连接测试 
[root@db01 ~]# mysql -uhui -p123 -h 10.0.0.51 -P 3306 
2.2 客户端工具

SQLyog
Navicat

2.3 程序连接

PHP : php-mysql API驱动
Python : pyMysql
JAVA
GO
C , C++
.NET
C#
perl
ruby

3. 初始化配置管理

3.1 方式

源码编译时
配置文件
命令行

3.2 配置文件应用
3.2.1 默认配置文件读取顺序
[root@db01 ~]# mysql --help --verbose |grep my.cnf
/etc/my.cnf  /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf  ~/.my.cnf 

假设: /etc/my.cnf --->  socket=/tmp/mysql.sock     ~/.my.cnf -->  socket=/tmp/my.sock
3.2.2 配置文件作用
# 1. 影响数据库服务端的启动和运行
# 2. 本地客户端的连接
3.2.3 配置文件的结构
[标签]
配置项=xxxx

[标签]作用是什么?
用来区分客户端和服务端的

标签的分类:
	服务端  : [server][mysqld][mysqld_safe]
	客户端  :  [client][mysql][mysqldump]....

[root@db01 ~]# cat /etc/my.cnf 
[mysqld]                     # 服务器程序标签
user=mysql                   # 管理用户
basedir=/data/app/mysql      # 程序目录
datadir=/data/3306/data      # 数据目录
server_id=6                  # 数据库ID号,主从时使用,区分不同节点。
socket=/tmp/mysql.sock       # socket文件位置

[client]                     # 客户端标签
socket=/tmp/mysql.sock       # 连接数据库时使用的socket位置
3.2.4 自定制配置文件位置
mv /etc/my.cnf /opt
pkill mysqld 
[root@db01 ~]# mysqld_safe --defaults-file=/opt/my.cnf & 

4. MySQL的启动和关闭

4.1 画图说明mysql的启动方式
1. 通过直接调用程序启动
/data/app/mysql/bin/mysqld &
/data/app/mysql/bin/mysqld_safe   &

好处在于,灵活的在命令行添加需要的配置参数。
2. 通过sys-v  systemd 方式启动 
service mysqld restart /stop /start /status 
systemctl start/stop/restart/status  mysqld
好处在于,启动关闭方便。但是需要依赖配置文件,不能单独添加(service除外)参数启动数据库。
4.2 关闭方法
service mysqld stop
systemctl stop mysqld
mysql -e "shutdown"
mysqladmin shutdown 

多实例的实现

1.1 准备多个目录

mkdir -p /data/330{7,8,9}/data

1.2 准备配置文件

cat > /data/3307/my.cnf <<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/data/3307/mysql-bin
EOF

cat > /data/3308/my.cnf <<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3308/data
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
port=3308
server_id=8
log_bin=/data/3308/mysql-bin
EOF

cat > /data/3309/my.cnf <<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
port=3309
server_id=9
log_bin=/data/3309/mysql-bin
EOF

1.3 初始化三套数据

mv /etc/my.cnf /etc/my.cnf.bak
mysqld --initialize-insecure  --user=mysql --datadir=/data/3307/data --basedir=/data/app/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3308/data --basedir=/data/app/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/data/3309/data --basedir=/data/app/mysql

1.4 systemd管理多实例

cd /etc/systemd/system
cp my.service mysqld3307.service
cp my.service mysqld3308.service
cp my.service mysqld3309.service


修改以下内容:

vim mysqld3307.service
ExecStart=/data/app/mysql/bin/mysqld  --defaults-file=/data/3307/my.cnf

vim mysqld3308.service
ExecStart=/data/app/mysql/bin/mysqld  --defaults-file=/data/3308/my.cnf


vim mysqld3309.service
ExecStart=/data/app/mysql/bin/mysqld  --defaults-file=/data/3309/my.cnf

1.5 授权

chown -R mysql.mysql /data/*

1.6 启动

systemctl start mysqld3307.service
systemctl start mysqld3308.service
systemctl start mysqld3309.service

1.7 验证多实例

netstat -lnp|grep 330
mysql -S /data/3307/mysql.sock -e "select @@server_id"
mysql -S /data/3308/mysql.sock -e "select @@server_id"
mysql -S /data/3309/mysql.sock -e "select @@server_id"

MySQL的体系结构

1 MySQL C/S工作模型

客户端 ------> 服务端
C                S

2 实例概念

实例:
mysqld核心守护进程(Boss)+
Master Thread(经理)+
干活的线程(员工)+
预分配内存(办公室)

3 mysqld核心主程序结构

连接层 : 连接协议,验证,连接线程
SQL层 : 语法,语义,权限, 解析预处理(代价),选择执行计划,执行SQL
小细节:
1. 查询缓存。
select user,host from mysql.user; hash—》 HASH_ID + 结果。
use mysql ; select user,host from user;
2. 日志记录。binlog , slowlog …

存储引擎层: 和磁盘交互的层次。相当于MySQL内置的文件系统。负责数据的存取。

4 逻辑结构(抽象结构)

库 : 库名 , 库属性 ,相当于Linux中的目录。
表 : 表名,列,数据行,表属性

Linux中一切皆文件,一切皆命令。
MySQL中一切皆表,一切皆SQL。

5 物理层

5.1 宏观角度

/data/3306/data 下的数据信息介绍:
库: 目录

表: 多个构成
mysql.user表 (MyISAM):
user.frm : 存储的表的列信息
user.MYD :存储的表的数据行
user.MYI :存储的是索引(相当一本书中的目录)

mysql.time_zone(InnoDB):
time_zone.frm : 存储的表的列信息
time_zone.ibd : 存储的表的数据行+索引
其他的信息:

5.2 InnoDB物理微观角度

段 : segment,表段,非分区表就是一个段。一个或多个extents组成
区 : extents ,簇,连续64个页,默认1M
页 : pages ,数据页,默认大小是16KB,连续4个OS block

为什么这么设计?
为了能够让MySQL的使用磁盘尽可能的都是顺序IO。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值