zoukankan      html  css  js  c++  java
  • 第二章--MYSQL体系结构和管理

    体系结构

    MySQL C/S模型

    CS模型

    • Server : mysqld

    • Client :

      • socket:仅本地连接使用
      • tcp/ip:应用连接使用(远程和本地)
      #TCP/IP方式(远程、本地)
      mysql -uroot -p123456 -h 10.0.0.51 -P3306
      
      #socket方式(仅本地)
      mysql -uroot -p123456 -S  /tmp/mysql.sock
      

    实例介绍

    实例=mysqld  --- > master thread ---> 干活的线程 + 预分配的内存结构
    公司=boss        	经理			     	员工         办公室
    

    实例=mysqld+master thread + N thread + 内存区域

    mysqld程序运行原理

    mysqld程序结构

    (

    SQL语句的执行个过程

    • 连接层

      (1)提供连接协议:TCP/IP 、SOCKET
      (2)提供验证:user、password,IP,SOCKET
      (3)提供专用连接线程:接收用户SQL,返回结果
      通过以下语句可以查看到连接线程基本情况

      mysql> show processlist;
      
    • SQL层

      (1)接收上层传送的SQL语句
      (2)语法验证模块:验证语句语法,是否满足SQL_MODE
      (3)语义检查:判断SQL语句的类型
      (4)权限检查:用户对库表有没有权限
      (5)解析器:对语句执行前,进行预处理,生成解析树(执行计划),说白了就是生成多种执行方案.
      (6)优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划

      (7)执行器:根据最优执行计划,执行SQL语句,产生执行结果

    • 存储引擎层(简单介绍)

      负责根据SQL层执行的结果,从磁盘上拿数据。
      将16进制的磁盘数据,交由SQL结构化化成表,
      连接层的专用线程返回给用户。

    MySQL的逻辑结构基本构成

    • 库(DATABASE,SCHEMA)
    • 表(TABLE.SEGMENT)
    • 用户(PRIVILEGES)
    • OTHER

    MySQL基础物理结构

    库:物理存储,相当于linux中的目录

    表:元数据(表名,表属性,表列)

    MyISAM(一种引擎)的表:
    .MYI	索性相关信息
    .MYD	存储数据行
    .frm	列的信息
    
    -rw-r----- 1 mysql mysql   10816 Apr 18 11:37 user.frm
    -rw-r----- 1 mysql mysql     396 Apr 18 12:20  user.MYD
    -rw-r----- 1 mysql mysql    4096 Apr 18 14:48 user.MYI
    
    InnoDB(默认的存储引擎)的表:
    .frm:	存储列相关信息
    .ibd:	数据行+索引(IOT)
    -rw-r----- 1 mysql mysql    8636 Apr 18 11:37 time_zone.frm
    -rw-r----- 1 mysql mysql   98304 Apr 18 11:37 time_zone.ibd
    

    INNODB表底层存储结构引入

    • 段:一个非分区表就是一个段(segment)

    • 区:大小为1M,默认是连续的64个page(extent)

    • 页:MySQL最小的IO单元,默认为16kb(page)

    MySQL基础管理

    用户

    用户的作用:登录mysql,管理MySQL的逻辑对象

    用户的定义方式

    用户的定义:用户名,白名单(主机列表)
    wordpress@'localhost'
    wordpress@'10.0.0.1'
    wordpress@'10.0.0.%'  ##
    wordpress@'10.0.0.5%'
    wordpress@'10.0.0.0/255.255.254.0'
    wordpress@'oldguo.com'
    wordpress@'db01'
    wordpress@'%'
    

    用户的管理操作

    #创建用户
    create user username@'10.0.0.%';
    
    #删除用户
    drop user username@'10.0.0.%';
    
    #查看用户
    select user,host from mysql.user;
    
    #设置用户密码
    alter user username@'10.0.0.%' identified by '123456';
    
    
    #创建用户同时创建密码
    create user username@'10.0.0.%' identified by '123456';
    

    8.0版本以前,grant 可以创建用户并授权。8.0版本以后必须先创建用户在授权

    权限

    权限的作用:开启用户管理对象的能力

    权限的定义

    grant all on wordpress.* to wordpress@'10.0.0.%' identified  by '123';
    

    授权范围

    *.* 			全库级别,一般为管理员
    wordpress.*		 单库级别,应用或开发
    wordpress.t1	 单表级别,很少使用
    

    生产环境用中授权

    应用用户一般
    select,insert,update,delete
    
    
    中小公司,开发人员leader一般
    SELECT,INSERT, UPDATE, DELETE,CREATE,ALTER,CREATE VIEW,SHOW VIEW,CREATE ROUTINE,ALTER ROUTINE,EVENT, TRIGGER
    

    mysql忘记本地管理员用户密码

    #关闭数据库
    /etc/init.d/mysqld stop
    
    #将数据库启动到无验证模式
    mysqld_safe --skip-grant-tables --skip-networking &
    #参数说明
    --skip-grant-tables	 //跳过授权表
    --skip-networking	 //禁用TCP/IP连接方式
    
    #修改管理员密码
    flush privileges;
    alter user root@'localhost' identified by '123456';
    quit
    
    #重启数据库为正常模式
    /etc/init.d/mysqld restart
    
    #测试是否修改成功
    mysql -uroot -p123456
    

    MySQL连接方式

    本地 -- 使用socket

    本地登录的用户,需要提前授权localhost相关用户

    mysql -uroot -p123 -S /tmp/mysql.sock
    

    远程 -- TPC/IP

    mysql -uoldguo -p  -h10.0.0.51 -P3306 
    

    mysql 自带命令

    命令:mysql
    参数
    	-u	登录用户
    	-p 	登录密码
    	-h 	连接的IP
    	-P 	端口号
    	-S 	socket文件
    	-e	非交互式登录
    	-V 	查看版本信息
    	<	导入数据库
    

    初始化配置

    作用:

    控制MySQL的启动
    影响到客户端的连接
    

    初始化配置文件的默认读取顺序

    [root@db01 ~]# mysqld --help --verbose |grep my.cnf
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
    注:
    默认情况下,MySQL启动时,会依次读取以上配置文件,如果有重复选项,会以最后一个文件设置的为准。
    但是,如果启动时加入了--defaults-file=xxxx时,以上的所有文件都不会读取.
    

    配置文件的书写方式:

    [标签]
    配置项=xxxx
    
    标签类型:服务端、客户端
    服务器端标签:
    [mysqld]
    [mysqld_safe]
    [server]
    
    客户端标签:
    [mysql]
    [mysqldump]
    [client]
    
    配置文件的示例展示:
    [root@db01 ~]# cat /etc/my.cnf
    [mysqld]
    user=mysql
    basedir=/app/mysql
    datadir=/data/mysql
    socket=/tmp/mysql.sock
    server_id=6
    port=3306
    log_error=/data/mysql/mysql.log
    [mysql]
    socket=/tmp/mysql.sock
    prompt=Master [\d]>
    

    MySQL多实例配置

    准备多个目录

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

    准备配置文件

    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
    

    初始化三套数据

    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
    

    设置systemd管理多实例

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

    修改sockte文件

    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
    

    授权

    chown -R mysql.mysql /data/*
    

    启动多实例mysql

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

    验证多实例

    # 查看多实例端口是否开启
    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"
    
  • 相关阅读:
    js变量如何赋值给css使用?
    前端预览与下载PDF小结
    子组件如何改父组件传过来的值
    TensorRT转换时的静态模式与动态模式
    Linux:搭建GlusterFS文件系统
    OpenFeign传输文件MultipartFile
    Docker:commit、export、import、save、load命令的使用
    Git:代码版本回退
    docker安装Drools Workbench
    ArchLinux:Typora设置gitee图床
  • 原文地址:https://www.cnblogs.com/lpcsf/p/12023599.html
Copyright © 2011-2022 走看看