zoukankan      html  css  js  c++  java
  • Day02 MySQL体系结构、用户权限管理、单机多实例配置

    1. 数据库逻辑结构

    何为逻辑结构?

    登录数据库后,通过执行SQL命令看到的对象,就是逻辑结构
    

    2. 数据库物理结构

    为么要研究数据库的物理结构?

    因为数据库的逻辑结构(库、表)最终还是要落到磁盘上,那么这些逻辑结构是如何进行存储的呢?这就是研究数据库物理结构的意义所在了。
    

    MySQL中的库,与库里面的表,都是存在于操作系统的目录中的,“库”以目录的形式展现,“表”以文件的方式展现。

    2.1 宏观方面(直接看到的文件)

    库:

    表:MyISAM引擎(存储引擎)

    [root@db01 /data/mysql/data/mysql]# ll user*
    -rw-r----- 1 mysql mysql 10816 Jun 13 14:25 user.frm  #<==列的相关信息(列的属性元数据)
    -rw-r----- 1 mysql mysql   396 Jun 13 16:00 user.MYD  #<==数据行
    -rw-r----- 1 mysql mysql  4096 Jun 13 16:00 user.MYI  #<==索引信息(书的目录)
    

    表:InnoDB引擎(存储引擎,有日志功能)

    [root@db01 /data/mysql/data/mysql]# ll time_zone*
    -rw-r----- 1 mysql mysql  8636 Jun 13 14:25 time_zone.frm  #<==列的定义信息
    -rw-r----- 1 mysql mysql 98304 Jun 13 14:25 time_zone.ibd  #<==数据行和索引
    

    面试题:请说一下MySQL中常见的存储引擎
    面试题:请你说明MyISAM和InnoDB在存储方式上的异同

    2.2 微观(看不到的)

    段(表),区(M),页(Page)(面试重点)
    一个表就是一个段,Mysql分配空间时,至少分配一个区(视存放数据的大小而定)每个区默认是1M(64个page),MySQL最小的IO单元是PAGE(16k)
    

    3. 基础管理

    3.1 用户管理

    3.1.1 用户的作用

    登录数据库
    管理数据库对象
    

    3.1.2 用户的定义

    用户名@'白名单'
    

    何为白名单?
    白名单就是允许用户登录的范围,如下所示:

    oldguo@'10.0.0.51'   #<==只允许oldguo用户从10.0.0.51这台服务器上登录数据库
    oldguo@'10.0.0.%'   #<==只允许oldguo用户从10.0.0网段(1-254)的所有服务器上登录数据库
    oldguo@'10.0.0.5%'   #<==只允许oldguo用户从10.0.0网段的50-59这个范围登录数据库
    oldguo@'10.0.0.0/255.255.254.0' #<==只允许oldguo用户从10.0.0网段的1-254和10.0.1网段的1-254这个范围登录数据库
    oldguo@'%' #<==允许oldguo用户从任何IP地址都可以登录数据库
    oldguo@'oldguo.com' #<==只允许oldguo用户从oldguo.com这个域名登录到数据库
    oldguo@'localhost' #<==只允许oldguo用户从本地登录到数据库
    oldguo@'db01' #<==只允许oldguo用户通过db01这个主机名登录到数据库
    

    常用的白名单配置方式如下:

    oldguo@'10.0.0.%'
    oldguo@'10.0.0.5%'
    oldguo@'10.0.0.0/255.255.254.0'
    oldguo@'localhost'
    

    3.1.3 用户管理

    创建用户
    mysql中默认的用户:root、mysql.sys、mysql.session

    3306 [(none)]>create user oldboy@'10.0.0.%' identified by '123';
    Query OK, 0 rows affected (0.00 sec)
    

    查看列的属性

    3306 [(none)]>desc mysql.user;
    

    image.png

    查询用户、主机、密码详细属性

    06 [(none)]>select user,host ,authentication_string from mysql.user;
    

    删除用户

    3306 [(none)]>drop user oldguo@'10.0.0.%';
    Query OK, 0 rows affected (0.12 sec)
    3306 [(none)]>select user,host,authentication_string from mysql.user;
    +---------------+------------+-------------------------------------------+
    | user          | host       | authentication_string                     |
    +---------------+------------+-------------------------------------------+
    | root          | localhost  | *E6CC90B878B948C35E92B003C792C46C58C4AF40 |
    | mysql.session | localhost  | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
    | mysql.sys     | localhost  | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
    | oldboy        | 10.0.0.%   | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    | oldboy        | 172.16.1.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    +---------------+------------+-------------------------------------------+
    5 rows in set (0.00 sec)
    

    修改用户

    3306 [(none)]>alter user root@'localhost' identified by '123'; #<==修改用户密码
    Query OK, 0 rows affected (0.00 sec)
    

    3.2 权限管理

    3.2.1 权限的作用

    控制用户登录后,能对MySQL数据库对象执行哪些命令。
    

    3.2.2 权限的定义

    # MySQL的权限定义就是针对SQL语句,如下:
    ALL:
    SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE
    ALL : 以上所有权限,一般是普通管理员拥有的
    with grant option:超级管理员才具备的,给别的用户授权的功能
    

    8.0 版本新特性(了解)

    加入了role(角色)的概念
    

    3.2.3 授权管理

    grant ALL on wordpress.* to wordpress@'10.0.0.%' identified by '123';
    grayn 授权 on 范围 to 用户 identified by '密码';
    grant select,updata,insert,delete on 范围 to 用户 identified by '123';
    

    范围:

    *.*  #<==所有库下面的所有表
    wordpress.*(推荐使用)#<==wordpress库里面的所有表
    wordpress.t1  #<==wordpress库里面的t1表
    

    练习1:从windows中的navicat软件使用root用户管理MySQL数据库

    3306 [(none)]>grant all on *.* to root@'10.0.0.%' identified by '123';
    Query OK, 0 rows affected, 1 warning (0.00 sec
    

    练习2:创建zhihu业务用户能够对zhihu业务库进行业务操作

    3306 [(none)]>grant select,update,delete,insert on zhihu.* to zhihu@'10.0.0.%' identified by '123';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    3306 [(none)]>flush privileges;
    Query OK, 0 rows affected (0.00 se
    

    请思考:有以下3条SQL语句,oldboy@'10.0.0.%'最终能对t1表具备什么样的权限?

    1. grant select,update on *.* to oldboy@'10.0.0.%';
    2. grant delete on wordpress.* to  oldboy@'10.0.0.%';
    3. grant insert on wordpress.t1 to  oldboy@'10.0.0.%';
    ----------------------------------------------------------------
    答:oldboy@'10.0.0.%'对t1表拥有的权限为:select,update,delete,insert
    因为在MySQL中的权限是可以继承的,多次授权是叠加的。
    那么想取消授权或取消某个授权时改怎么做呢?
    如果想要取消某个权限,必须通过回收(revoke)的方式实现,而不能多次重复授权。
    

    查看授权:

    3306 [(none)]>show grants for oldboy@'10.0.0.%';
    +-------------------------------------------+
    | Grants for oldboy@10.0.0.%                |
    +-------------------------------------------+
    | GRANT USAGE ON *.* TO 'oldboy'@'10.0.0.%' |
    +-------------------------------------------+
    1 row in set (0.09 sec)
    

    增加一个超级管理员:

    3306 [(none)]>grant all on *.* to oldboy@'10.0.0.%' identified by '123' with grant option;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    3306 [(none)]>show grants for oldboy@'10.0.0.%';
    +----------------------------------------------------------------------+
    | Grants for oldboy@10.0.0.%                                           |
    +----------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'oldboy'@'10.0.0.%' WITH GRANT OPTION |
    +----------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    回收权限

    3306 [(none)]>revoke all on zhihu.* from 'zhihu'@'10.0.0.%';
    3306 [(none)]>show grants for zhihu@'10.0.0.%';
    +------------------------------------------+
    | Grants for zhihu@10.0.0.%                |
    +------------------------------------------+
    | GRANT USAGE ON *.* TO 'zhihu'@'10.0.0.%' |
    +------------------------------------------+
    1 row in set (0.00 sec)
    

    面试题:
    1. 开发人员找DBA开用户,需要和开发人员沟通什么?

    (1)你要做哪些权限操作
    (2)你要从什么地址(IP地址)来登录数据库
    (3)要对什么对象(库,表)进行管理操作
    

    2. 开发人员私下找DBA要管理员(root)用户的密码(也就是root权限),作为DBA你怎么处理?(金融公司)
    情况1:(正规公司,有明显的规章制度)

    (1)不给
    (2)在金融公司严令禁止,一旦发现立马举报!!!
    

    情况2:(小公司,没有规章制度)

    root权限是乱用的,这个时候要学会保护自己,谁要root权限,就把责任给谁。
    可以提意见,生成流程,规章制度。
    

    4. MySQL连接管理

    4.1 自带的客户端连接工具

    mysql命令参数常用用法:
    参数:(-u、-p、-h、-P、-S、-e、<)
    -u 用户名
    -p 密码

    [root@db01 ~]# mysql -uroot -p
    Enter password:
    

    -S socket文件连接方式

    [root@db01 ~]# mysql -uroot -p -S /tmp/mysql.sockEnter password:
    

    -h #=>>*
    >>>>>>>>>>>>>>TCP/IP连接方式
    **-P #=>>
    *

    [root@db01 ~]# mysql -uroot -p -h10.0.0.51 -P3306  #<==连接时用户必须存在
    Enter password:
    

    思考:连接时,既指定了本地连接,又指定了TCP/IP连接,它会选谁呢?

    答:数据库连接时,优先选择TCP/IP连接
    

    -e :在命令行非交互式执行SQL语句

    [root@db01 ~]# mysql -uroot -p123 -h10.0.0.51 -e "show databases;"
    mysql: [Warning] Using a password on the command line interface can be insecure.
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | zhihu              |
    +--------------------+
    

    <:把文件内的数据库登录密码重定向给mysql -uroot -p

    [root@db01 ~]# mysql -uroot -p < world.sql 
    Enter password: 
    [root@db01 ~]# mysql -uroot -p123 -h10.0.0.51 -e "show databases;"
    mysql: [Warning] Using a password on the command line interface can be insecure.
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | world              |
    | zhihu              |
    +--------------------+
    

    如何证明你的数据库是可用的,可连接的?
    1. 证明数据库的端口和进程号是存在的,存在证明数据库是正常启动的。

    [root@db01 ~]# netstat -lntup|grep mysqld
    tcp6       0      0 :::3306                 :::*                    LISTEN      11774/mysqld        
    [root@db01 ~]# lsof -i :3306
    COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    mysqld  11774 mysql   30u  IPv6  62541      0t0  TCP *:mysql (LISTEN)
    

    2. 验证用户远程连接是否正常

    [root@db01 ~]# mysql -uroot -p -h 10.0.0.51
    Enter password:
    

    4.2 远程的客户端连接工具

    使用navicatsqlyog,此处略…………

    5. MySQL 启动方式介绍

    辅助脚本方式(普通的启动关闭)
    (1)sys-v启动方式:把mysql.server复制到/etc/init.d/mysqld

    启动方式1:/etc/init.d/mysqld
    启动方式2:service mysqld start
    

    (2)systemd启动方式:把mysql.server复制到/etc/systemd/system/mysqld.service

    启动方式1:/etc/systemd/system/mysqld.service
    启动方式2:systemctl start mysqld
    

    以上这两种辅助启动方式的最终目的都是为了把“mysqld”给启动起来,那么它们的执行过程是怎样的呢?如下:

    (1)sys-v启动方式:执行service msyql start 时,会启用/application/mysql/bin/mysqld_safe,然后启用/application/mysql/bin/mysqld
    这样用的原因是:当我们的数据库异常宕机后,如果Mysql_safe检测到,会自动再启动mysqld一次。
    但是,如果是真实的生产场景中发生了这种情况,不要立即启动数据库,一定要先对数据进行备份,然后再想办法启动数据库。
    
    (2)systemd启动方式:执行systemctl start mysqld时,会直接调用/application/mysql/bin/mysqld
    

    维护性的启动方式:

    什么是维护性(临时)的启动方式?
    平时出了问题或故障,或需要临时性变更,这个时候就需要临时启动一下,然后加一些参数或是维护性的动作。比如说忘记密码了,就需要通过“/application/msyql/bin/mysqld_safe --skip-grant-tables --skip-networking &”,这就是一种维护性(临时)的启动方式。
    还有/application/mysql/bin/mysqld &也是维护性(临时)的启动方式 
    

    6. MySQL 初始化配置(数据库启动之前)

    6.1 预编译时进行设置(略)

    只能在编译安装中实现
    预编译:硬编码配置到程序中

    6.2 初始化配置文件(my.cnf)

    6.2.1 初始化配置文件的默认读取位置

    [root@db01 ~]# mysqld --help --verbose| grep "my.cnf"
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf (读取优先级从后往前)
                          (忽略这一行)my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default
    
    指定默认读取配置文件参数
    --defaults-file=/opt/my.cnf
    执行方式:
    mysqld_safe --defaults-file=/opt/my.cnf &
    mysqld --defaults-file=/opt/my.cnf &
    

    6.3 命令行模式

    6.4 初始化配置文件的应用

    6.4.1 初始化配置文件(my.cnf)的作用

    可以影响到数据库的启动
    启动方式:mysqld、msysqld_safe
    客户端的连接:mysql、mysqldump、mysqladmin
    

    6.4.2 书写格式

    [程序名]
    配置项=xxx
    配置项=xxx
    …………
    (只要是支持的,都可以写)
    
    服务端
    [server](包含以下两种)
    [mysqld]
    [mysqld_safe]
    
    客户端
    [client]
    [mysql]
    [mysqldump]
    

    6.4.3 MySQL初始化配置的常用参数

    通用型配置文件:(以下配置都是生产环境中必开的)
    [mysql](服务端)#改服务端必须重启生效
    user=mysql 管理用户用户名
    basedir=/application/mysql 
    datadir=/data/mysql/data
    socket=/tmp/msyql.sock
    server_id=6(1-65536)服务序号
    port=3306
    log_error=/data/mysql/data/mysql.log
    log_bin=/data/mysql/data/mysql-bin  #>>二进制文件位置+文件名前缀,该日志是
    [mysql] #客户端
    socket=/tmp/mysql.sock
    #以上信息都可以去官网参考,my.cnf的写法(https://dev.mysql.com/doc/refman/5.7/en/option-files.html)
    

    7. MySQL 多实例(多个不同的端口)

    准备3个实例

    7.1

    [root@db01 /data]# mkdir -p /data/330{7,8,9}/data
    [root@db01 ~]# cd /data/
    [root@db01 /data]# ls
    3307  3308  3309  mysql
    

    7.2 准备配置文件

    cat > /data/3307/my.cnf <<EOF
    [mysqld]
    basedir=/application/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=/application/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=/application/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
    

    7.3 初始化三套数据

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

    7.4 systemd管理多实例

    cd /etc/systemd/system
    cp mysqld.service mysqld3307.service
    cp mysqld.service mysqld3308.service
    cp mysqld.service mysqld3309.service
    
    vim mysqld3307.service
    ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3307/my.cnf
    vim mysqld3308.service
    ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3308/my.cnf
    vim mysqld3309.service
    ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3309/my.cnf
    

    7.5 授权

    chown -R mysql.mysql /data/*
    

    7.6 启动

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

    7.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"
    

    成功后的显示

    [root@db01 ~]# mysql -S /data/3307/mysql.sock -e "select @@server_id"+-------------+
    | @@server_id |
    +-------------+
    |           7 |
    +-------------+
    [root@db01 ~]# mysql -S /data/3308/mysql.sock -e "select @@server_id"+-------------+
    | @@server_id |
    +-------------+
    |           8 |
    +-------------+
    [root@db01 ~]# mysql -S /data/3309/mysql.sock -e "select @@server_id"+-------------+
    | @@server_id |
    +-------------+
    |           9 |
    +-------------+
    
    

    停止

    systemctl stop mysqld3308.service
    
  • 相关阅读:
    表达式:使用API创建表达式树(3)
    表达式:使用API创建表达式树(2)
    表达式:使用API创建表达式树(1)
    设计模式——策略模式
    设计模式——简单工厂
    Vue计算属性的用法
    Vue之组件使用(二)
    Vue之组件使用(一)
    Spring官网下载dist.zip的几种方法
    尝试加载 Oracle 客户端库时引发 BadImageFormatException
  • 原文地址:https://www.cnblogs.com/xiets/p/13541174.html
Copyright © 2011-2022 走看看