• 数据库介绍(MySQL安装 体系结构、基本管理)


    第1章 数据库介绍及mysql安装

    1.1 数据库简介

      数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。

      所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

    1.1.1 什么是数据

      数据是指对客观事件进行记录并可以鉴别的符号,是对客观 事物的性质、状态以及相互关系等进行记载的物理符号或这些物 理符号的组合。它是可识别的、抽象的符号。

    1.1.2 数据库管理系统

    非关系型数据库

    NoSQL:非关系型数据库(Not only SQL)

    不是否定关系型数据库,做关系型数据库的的补充。
    想做老大,先学会做老二。

     

    关系型数据库

    关系型数据库的特点

    二维表
    典型产品 Oracle传统企业,MySQL是互联网企业
    数据存取是通过SQL(结构化查询语句)
    最大特点,数据安全性方面强(ACID) 

    1.1.3 NoSQL特性总览

    l  不是否定关系型数据库,而是作为补充,现在也有部分替代的趋势。

    l  关注高性能,高并发,灵活性,忽略和上述无关的功能。

    l  现在也在提升安全性和使用功能。

    l  典型产品:Redis(持久化缓存,两个半天)、MongoDB(最接近关系型数据 的NoSQL)、Memcached。

    l  管理不适用SQL管理,而是用一些特殊的 API 或 数据接口。

    1.1.4 NoSQL的分类、特点、典型产品

    键值(KV)存储:Memcached、Redis

    列存储(column-oriented):HBASE(新浪,360)、Cassandra(200台服务器集群 )

    文档数据库(document-oriented):MongoDB(最接近关系型数据库的NoSQL)

    图形存储(Graph):Neo4j

    数据来源: https://db-engines.com/en/ranking

    1.2 数据库相关产品

    1.2.1 Oracle公司产品介绍

    Oracle数据库版本介绍

      7--8i--9i--10g—11g--12c--18c(?)

    Oracle的市场应用

      a)  市场份额第一,趋势递减

      b)  市场空间,传统企业

      c)  传统企业也在互联网化

    MySQL数据库版本介绍

      5.0--5.1--5.5--5.6--5.7--8.0

    MySQL的市场应用

      a)  中、大型互联网公司

      b)  市场空间:互联网领域第一

      c)  趋势明显

      d)  同源产品:MariaDB、perconaDB

    1.2.2 其他公司产品

    微软:SQL Server

    微软和sysbase合作开发的产品,后来自己开发,windows平台
    3,4线小公司,传统行业在用

    IBM :DB2数据库

      市场占有量小

      目前只有:国有银行(人行、中国银行、工商银行等)、中国移动应用。

    下面三者广泛应用在大型互联网公司

    PostgreSQL
    MongoDB
    Redis

    1.3 Mysql简介

    1.3.1 mysql数据库发展史

    1 1979年,报表工具Unireg出现。
    2 1985 年,以瑞典David Axmark 为首,成立了一家公司(AB前身),IASM引擎出现。
    3 1990年,提供SQL支持。
    4 1999-2000年,MySQL AB公司成立,并公布源码,开源化。
    5 2000年4月BDB引擎出现,支持事务。
    6 2008年1月16日,Sun(太阳微系统)正式收购MySQL。
    7 2009年4月20日,甲骨文公司宣布以每股9.50美元,74亿美元的总额收购Sun电脑公司,MySQL 转入Oracle 门下。
    8 2013年6月18日,甲骨文公司修改MySQL授权协议,移除了GPL。但随后有消息称这是一个bug。

    1.3.2 MySQL的特点简介

    开源、社区版免费、简单,使用方便,可靠、稳定、安全、社区活跃

    1.3.3 mysql产品线的介绍

    mysql产品线(主线)

    3.26--5.2版本

      – 正宗后代

      – Centos5、6中默认有5.1版本

      – Centos7中默认是MariaDB

    5.4--5.7 ,8.0版本

      – 借鉴社区好的贡献,进一步开发的版本

      – 主流版本:5.5 5.6 5.7

    MySQL Cluster 6.0 版本&更高

      – 类似于Oracle RAC,硬件要求高。

      – 一般各大网站没有人用

    mysql产品线(派生产品)

      派生版本有Drizzle、MariaDB、Percona Server及OurDelta等。

    1.3.4 企业生产场景选择MySQL数据库建议:

    1)稳定版:选择开源的社区版的稳定版GA版本 
    2)产品线:可以选择5.1或5.5 互联网公司主流5.5,其次是5.1和5.6 
    3)选择MySQL数据库GA版发布后6个月以上的GA版本。 
    4)要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本 
    5)最好向后较长时间没有更新发布的版本 
    6)要考虑开发人员开发程序使用的版本是否兼容你选的版本 
    7)作为内部开发人员开发测试数据库环境,跑大概3-6个月的事件 
    8)优先企业非核心业务采用新版本的数据库GA版本软件 
    9)向DBA高手请教,或者在及技术氛围好的群里和大家一起交流,使用真正的高手们用过的好用的GA版本产品
    10)若是没有重要的功能BUG或性能瓶颈,则可以开始考虑作为任何任务数据服务的后端数据库软件

    1.4 mysql数据库的安装

    1.4.1 系统环境说明

    [root@db02 ~]# cat /etc/redhat-release 
    CentOS release 6.9 (Final)
    [root@db02 ~]# uname -r
    2.6.32-696.el6.x86_64
    [root@db02 ~]# /etc/init.d/iptables status
    iptables: Firewall is not running.
    [root@db02 ~]# getenforce 
    Disabled
    [root@db02 ~]# hostname  -I 
    10.0.0.52 172.16.1.52

    1.4.2 mysql编译安装

    安装依赖包

    yum  install  -y  ncurses-devel libaio-devel

    安装cmake编译工具

    cmake

    定制功能:存储引擎、字符集、压缩等

    定制安装位置、数据存储位置、文件位置(socket)

    yum install cmake -y

    创建mysql管理用户

    useradd -s /sbin/nologin -M mysql -u1000
    id mysql

    下载mysql软件包,解压

    mkdir  -p /server/tools 
    cd /server/tools
    wget -q http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.40.tar.gz
    tar xf mysql-5.6.40.tar.gz

    注:这里使用的是sohu的镜像源进行下载(软件版本5.6.40)

    官方下载方式参考:http://www.cnblogs.com/clsn/p/8025324.html#_label4

    进入查询目录,使用cmake进行编译,安装,创建软连接,过程时间较长。

    cd mysql-5.6.40
    cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 
    -DMYSQL_DATADIR=/application/mysql-5.6.40/data 
    -DMYSQL_UNIX_ADDR=/application/mysql-5.6.40/tmp/mysql.sock 
    -DDEFAULT_CHARSET=utf8 
    -DDEFAULT_COLLATION=utf8_general_ci 
    -DWITH_EXTRA_CHARSETS=all 
    -DWITH_INNOBASE_STORAGE_ENGINE=1 
    -DWITH_FEDERATED_STORAGE_ENGINE=1 
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 
    -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 
    -DWITH_ZLIB=bundled 
    -DWITH_SSL=bundled 
    -DENABLED_LOCAL_INFILE=1 
    -DWITH_EMBEDDED_SERVER=1 
    -DENABLE_DOWNLOADS=1 
    -DWITH_DEBUG=0
    make && make install
    ln -s /application/mysql-5.6.40/ /application/mysql

    1.4.3 数据库安装后的操作

    复制配置文件

    cp  /application/mysql/support-files/my-default.cnf /etc/my.cnf

    编译的MySQL可以暂时不需要设置配置文件。

    注意:如果以前操作系统中安装过rpm格式的mysql,系统中可能会遗留/etc/my.cnf文件,我们需要将它删除掉

    初始化数据库

    /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql

    防止报错:数据库启动会提示,找不到xx/tmp/mysql.sock,原因是5.6.40版本不会自动创建tmp目录,需要我们手工创建。

    mkdir /application/mysql/tmp

    修改程序目录的属主,属组

    chown -R mysql.mysql /application/mysql/

    复制启动脚本,并修改权限

    cp support-files/mysql.server /etc/init.d/mysqld
    chmod 700 /etc/init.d/mysqld

    添加环境变量,使用mysql命令

    echo 'PATH=/application/mysql/bin/:$PATH' >>/etc/profile
    tail -1 /etc/profile
    source /etc/profile
    echo $PATH
    mysql

    1.4.4 数据库安全设置

    设置root用户密码

    mysqladmin -u root password '123456'
    mysql -uroot -p123456

    优化数据库(清理用户及无用数据库)

    select user,host from mysql.user;
    drop user ''@'db02';
    drop user ''@'localhost';
    drop user 'root'@'db02';
    drop user 'root'@'::1';
    select user,host from mysql.user;
    drop database test;
    show databases;

    1.5 mysql 5.7版本安装说明

    主机系统环境说明

    [root@db13 ~]# cat /etc/redhat-release
    CentOS release 6.9 (Final)
    [root@db13 ~]# uname -r
    2.6.32-696.el6.x86_64
    [root@db13 ~]# getenforce
    Disabled
    [root@db13 ~]# /etc/init.d/iptables status
    iptables: Firewall is not running.
    [root@db13 ~]# hostname -I
    10.0.0.153 172.16.1.153

    获取软件(采用二进制包方式进行安装)

    mkdir -p /server/tools
    cd /server/tools
    wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

    解压

    tar xf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

    将软件移动到程序目录,创建软连接

    mkdir -p /application/
    mv mysql-5.7.17-linux-glibc2.5-x86_64 /application/mysql-5.7.17
    ln -s /application/mysql-5.7.17 /application/mysql

    添加mysql用户,并进行授权

    useradd -M -s /sbin/nologin  -u 1000 mysql
    chown -R mysql.mysql /application/mysql-5.7.17

    初始化数据库

    /application/mysql-5.7.17/bin/mysqld --initialize --user=mysql --basedir=/application/mysql-5.7.17 --datadir=/application/mysql-5.7.17/data

    初始化时注意最后一行输出root密码

    2017-12-13T08:40:31.760309Z 1 [Note] A temporary password is generated for root@localhost: )*1E7=fYd&>i

    拷贝配置文件和启动文件

    cp /application/mysql-5.7.17/support-files/my-default.cnf /etc/my.cn
    cp application/mysql-5.7.17/support-files/mysql.server /etc/init.d/mysqld

    # 修改启动文件内容(配置目录)

    将程序安装到 /usr/local/ 下 可以省略这步操作

    sed 's#/usr/local#/application#g' /application/mysql-5.7.17/bin/mysqld_safe /etc/init.d/mysqld -i

    启动mysql

    [root@db13 tools]# /etc/init.d/mysqld start 
    Starting MySQL.Logging to '/application/mysql/data/db13.err'.
     SUCCESS! 
    [root@db13 tools]# /etc/init.d/mysqld status
     SUCCESS! MySQL running (1509)

    添加环境变量

    echo 'PATH=/application/mysql/bin/:$PATH' >>/etc/profile
    tail -1 /etc/profile
    source /etc/profile
    echo $PATH

    修改mysql密码

    [root@db13 tools]# mysqladmin -uroot -p password 123456
    Enter password: 【输入初始化时生成的密码】
    mysqladmin: [Warning] Using a password on the command line interface can be insecure.
    Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

    第2章 Mysql体系结构与基本管理

    2.1 客户端与服务器端模型

    2.1.1 mysql服务结构

    mysql是一个典型的c/s模式,服务端与客户端两部分组成

            服务端程序 mysqld
            客户端程序 mysql自带客户端(mysql、mysqladmin、mysqldump等)
                      第三方客户端  API接口(php-mysql)

     

    2.1.2 mysql连接方式

    TCP/IP 连接   网络连接串(通过用户名 密码 IP 端口进行连接)

    mysql -uroot -p123 -h 127.0.0.1 -P 3306

     

    socket 连接   网络套接字(用户名 密码  socket文件)

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

     

    在linux中使用mysql命令不加其他的参数连接方式即

    mysql -uroot -poldboy123使用的是套接字文件方式登录的

    2.1.3 MySQL在启动过程

    启动后台守护进程,并生成工作线程

    预分配内存结构供MySQL处理数据使用

    实例就是MySQL的后台进程+线程+预分配的内存结构

    2.2 Mysqld服务的构成

     

    2.2.1 连接层

     

    通讯协议为:tcp/ip 或 socket

    连接线程 为连接的数量

    用户验证 为通过用户名 密码验证进行通讯协议

    2.2.2 SQL层

     

    sql即结构化的查询语句(数据库内部逻辑语言)sql92 sql99

      DDL 数据库定义语言

      DCL 数据库控制语言

      DML 数据库操作语言

      DQL 数据查询语言

    SQL层的功能: select * from wordpress.user;

    1、判断语法、语句、语义
        判断语句类型 
    2、数据库不能直接响应sql语句
        必须明确的知道数据在哪个磁盘  
    3、数据库对象授权情况判断
        授权失败不继续
    4、解析(解析器)
        将sql语句解析成执行计划,运行执行计划,生成找数据的方式
    5、优化 (优化器)
        运行执行计划
       5.6之后 基于代价的算法,从执行计划中选择代价最小的交给"执行器"
    6、"执行器"
        运行执行计划 
        最终生产如何去磁盘找数据方式
    7、将取数据的方式,交由下层(存储引擎层)进行处理
    
    8、最终将取出的数据抽象成管理员或用户能看懂的方式(表),展现在用户面前
    
    9、查询缓存: 缓存之前查询的数据。
        假如我们查询的表是一个经常有变动的表,查询缓存不要设置太大  

    SQL层处理流程

     

    2.2.3 存储引擎层

    由上层决定存储方式

      存储引擎是充当不同表类型的处理程序的服务器组件。

    存储引擎层功能:

      存数据、取数据

      数据的不同存储方式

    不同的管理方式:

      事务(增、删、改)

      备份恢复       

      高级功能(高可用的架构、读写分离架构)

    2.2.4 依赖于存储引擎的功能

    存储引擎是充当不同表类型的处理程序的服务器组件。

    存储引擎用于:

    存储数据、检索数据、通过索引查找数据
    存储介质、事务功能、锁定、备份和恢复、优化

    特殊功能:

    全文搜索、引用完整性、空间数据处理    

    双层处理

    上层包括SQL解析器和优化器、下层包含一组存储引擎

    SQL 层不依赖于存储引擎:

    引擎不影响SQL处理

    2.2.5 mysql 的逻辑构成(数据库内部结构)

    逻辑构成是为了用户能够读懂数据出现的,让你更好的理解数据。

    管理数据的一种方式。

    对象:
      库中包含表,在linux中以目录表示
      表中有列结构与行记录,在linux中以多个文件表示
        行记录
        列结构

    切换库

    mysql> use mysql;

    查看表

    mysql> show tables;

    查看列的信息(记录)

    mysql> desc user;

    2.2.6 mysql的存储方式

      程序文件随数据目录一起存储在服务器安装目录下。执行各种客户机程序、管理程序和实用程序时将创建程序可执行文件和日志文件。首要使用磁盘空间的是数据目录。

    服务器日志文件和状态文件:

      包含有关服务器处理的语句的信息。日志可用于进行故障排除、监视、复制和恢复。

      InnoDB 日志文件: (适用于所有数据库)驻留在数据目录级别。

      InnoDB 系统表空间:  包含数据字典、撤消日志和缓冲区。

      每个数据库在数据目录下均具有单一目录(无论在数据库中创建何种类型的表)。数据库目录存储以下内容:

    数据文件:
         特定于存储引擎的数据文件。这些文件也可能包含元数据或索引信息,具体取决于所使用的存储引擎。
    格式文件 (.frm):
       包含每个表和/或视图结构的说明,位于相应的数据库目录中。
    触发器:
         与某个表关联并在该表发生特定事件时激活的命名数据库对象。

      数据目录的位置取决于配置、操作系统、安装包和分发。典型位置是 /var/lib/mysql。

      MySQL 在磁盘上存储系统数据库 (mysql)。

      mysql 包含诸如用户、特权、插件、帮助列表、事件、时区实现和存储例程之类的信息。

    2.2.7 MySQL体系结构小结

    sql 优化相关的理念

      解析器 : 执行计划  数据库执行sql的一种方式 

      优化器 : 知道基本规则,直接影响将来选择哪个执行计划

      查询缓存 : 生产环境中,一般会用redis memcached 来代替

    逻辑结构

    库    就是一个目录,为了存放多张表

    表    在相应的库中,用多个文件来表示

      myisam表 3个文件:(.myd数据文件  .myi索引文件 frm表 结构定义文件)

      innodb:  2个或者一个,共享表空间(ibdata1 基表 元数据)、独立表空间(5.6以后默认的表存储方式)

    如何使用磁盘

      1、多个库多个目录,目录下存放了多个表的存储文件

      2、  auto.cnf           db02.err           db02.pid           ibdata1             ib_logfile0       ib_logfile1                等

    2.3 MySQL管理

    2.3.1 连接管理:mysql

    [root@db02 ~]# mysql --help
    -u <user_name> 或 --host=<user_name>
    -p<password>
    -h <host_name> 或 --host=<host_name>
    --protocol=<protocol_name> 
    -P <port_number> 或 --port=<port_number> 
    -S <socket_name> 或 --socket=<socket_name>

    常用的连接方式:

    套接字:  mysql -uroot -p123  -S /application/mysql/tmp/mysql.sock
    Tcp/Ip: mysql -uroot -p123 -h 10.0.0.52 -P 3306

    2.3.2 数据库的启动流程

    mysqld 文件属性

    [root@db02 ~]# cd /application/mysql/bin/
    [root@db02 bin]# file mysqld
    mysqld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

    mysql.server文件属性

    [root@db02 bin]# file ../support-files/mysql.server 
    ../support-files/mysql.server: POSIX shell script text executable

    mysqld_safe文件属性

    [root@db02 data]# file /application/mysql/bin/mysqld_safe 
    /application/mysql/bin/mysqld_safe: POSIX shell script text executable

    可以看出mysql.server文件与mysqld_safe文件都是脚本文件,最后都调用mysqld二进制文件进行启动。

    2.3.3 mysql的关闭方法

    推荐使用的方法:

    1、mysqladmin -uroot -p123 shutdown
    2、servive mysqld stop

    尽量避免使用kill命令

    mysqladmin命令关闭mysql

    [root@db02 bin]# mysqladmin shutdown -uroot -p123
    Warning: Using a password on the command line interface can be insecure.

    perror命令

    [root@db02 bin]# perror 13
    OS error code  13:  Permission denied

    perror命令是mysql自带命令,能够查询mysql错误代码的含义。

    2.3.4 my.cnf 配置文件说明

    功能 

      1、影响到服务器进程的启动

      2、影响到客户端程序

    配置my.cnf

    使用不同的"标签"去明确指定影响哪部分功能

    服务器端

    [server]
        [mysqld] -----> 一般设置此项
        [mysqld_safe]
    [client]     ----> 为了方便设置此项
        [mysql] 
        [mysqladmin]
        [mysqldump]

    my.cnf文件配置实例

    [root@db02 data]# cat /etc/my.cnf
    [mysqld]
    basedir=/application/mysql
    datadir=/application/mysql/data
    socket=/tmp/mysql.sock
    log-error=/var/log/mysql.log
    port=3307
    [mysql]
    socket=/tmp/mysql.sock
    user=root
    password=123

    检查进程信息,可以看到与my.cnf配置的相同

    [root@db02 data]# ps -ef |grep [my]sql 
    root       3411   1918  0 15:52 pts/1    00:00:00 /bin/sh /application/mysql/bin/mysqld_safe
    mysql      3548   3411  0 15:52 pts/1    00:00:00 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/var/log/mysql.log --pid-file=/application/mysql/data/db02.pid --socket=/tmp/mysql.sock --port=3307

    my.cnf文件的配置

     

    2.3.5 配置文件的读取过程

    /etc/my.cnf --> /etc/mysql/my.cnf --> $MYSQL_HOME/my.cnf --> defaults-extra-file=/tmp/clsn.txt --> ~/.my.cnf

      注:假设4个配置文件都存在,同时使用--defaults-extra-file指定了参数文件,如果这时有一个 "参数变量"在5个配置文件中都出现了,那么后面的配置文件中的参数变量值会覆盖前面配置文件中的参数变量值,就是说会使用 ~/.my.cnf 中设置的值

      如果使用./bin/mysqld_safe 守护进程启动mysql数据库时,使用了 --defaults-file=<配置文件的绝对路径>参数,这时只会使用这个参数指定的配置文件。

    2.4 mysql多实例配置

    2.4.1 什么是MySQL多实例?

     

      简单地说,MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306/3307)同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。

      这些MySQL多实例共用一套MySQL安装程序,使用不同的my.cnf(也可以相同)配置文件、启动程序(也可以相同)和数据文件。在提供服务时,多实例MySQL在逻辑上看来是各自独立的,他们根据配置文件对应设定值,获得服务器响应数量的资源。

    2.4.2 MySQL多实例的作用与问题

    有效利用服务器资源

      当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离

    节约服务器资源

      当公司资金紧张,但是数据库又需要各自尽量独立地提供服务,而且,需要主从复制等技术时,多实例就再好不过了

      MySQL多实例有它的好处,但也有弊端,比如,会存在资源互相抢占的问题。当某个数据库实例并发很高或者有SQL慢查询时,整个实例会消耗大量的系统CPU、磁盘I/O等资源,导致服务器上的其他数据库实例提供服务的质量一起下降。

    2.4.3 多实例配置思路

    1 多套配置文件
    2 多套 数据
    3 多个socket
    4 多个端口
    5 多个日志文件
    6 多个启动程序

    2.4.4 多实例配置过程

    前期mysql的安装与1.4MySQL的安装一致,在这里就不再重复(配置完成不要启动)

    第一个里程碑:多实例配置文件准备

    [root@db02 /]# tree /data/
    /data/
    ├── 3306
    │   ├── my.cnf
    │   └── mysql
    └── 3307
        ├── my.cnf
        └── mysql

    3306端口my.cnf配置文件

    [root@db02 /]# cat data/3306/my.cnf 
    [client]
    port            = 3306
    socket          = /data/3306/mysql.sock
    
    [mysqld]
    user    = mysql
    port    = 3306
    socket  = /data/3306/mysql.sock
    basedir = /application/mysql
    datadir = /data/3306/data
    log-bin = /data/3306/mysql-bin
    server-id = 6
    
    [mysqld_safe]
    log-error=/data/3306/mysql_3306.err
    pid-file=/data/3306/mysqld.pid

    3307端口my.cnf配置文件

    [root@db02 /]# cat  /data/3307/my.cnf 
    [client]
    port            = 3307
    socket          = /data/3307/mysql.sock
    
    [mysqld]
    user    = mysql
    port    = 3307
    socket  = /data/3307/mysql.sock
    basedir = /application/mysql
    datadir = /data/3307/data
    log-bin = /data/3307/mysql-bin
    server-id = 7
    
    [mysqld_safe]
    log-error=/data/3307/mysql_3307.err
    pid-file=/data/3307/mysqld.pid

    编写管理脚本3306

    [root@db02 /]# cat data/3306/mysql 
    #!/bin/sh
    #3306 start scripts
    #init
    port=3306
    mysql_user="root"
    CmdPath="/application/mysql/bin"
    mysql_sock="/data/${port}/mysql.sock"
    mysqld_pid_file_path=/data/3306/3306.pid
    start(){
        if [ ! -e "$mysql_sock" ];then
             printf "Starting MySQL...
    "
            /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
            sleep 3
        else
            printf "MySQL is running...
    "
            exit 1
        fi
    }
    stop(){
        if [ ! -e "$mysql_sock" ];then
            printf "MySQL is stopped...
    "
            exit 1
        else
            printf "Stoping MySQL...
    "
            mysqld_pid=`cat "$mysqld_pid_file_path"`
             if (kill -0 $mysqld_pid 2>/dev/null)
               then
                 kill $mysqld_pid
                 sleep 2
             fi
        fi
    }
    
    restart(){
        printf "Restarting MySQL...
    "
        stop
        sleep 2
        start
    }
    
    case "$1" in
        start)
            start
        ;;
        stop)
            stop
        ;;
        restart)
            restart
        ;;
        *)
            printf "Usage: /data/${port}/mysql {start|stop|restart}
    "
    esac

    编写管理脚本3307

    [root@db02 /]# cat data/3307/mysql 
    #!/bin/sh
    #3307 start scripts
    #init
    port=3307
    mysql_user="root"
    CmdPath="/application/mysql/bin"
    mysql_sock="/data/${port}/mysql.sock"
    mysqld_pid_file_path=/data/3307/3307.pid
    start(){
        if [ ! -e "$mysql_sock" ];then
             printf "Starting MySQL...
    "
            /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
            sleep 3
        else
            printf "MySQL is running...
    "
            exit 1
        fi
    }
    stop(){
        if [ ! -e "$mysql_sock" ];then
            printf "MySQL is stopped...
    "
            exit 1
        else
            printf "Stoping MySQL...
    "
            mysqld_pid=`cat "$mysqld_pid_file_path"`
             if (kill -0 $mysqld_pid 2>/dev/null)
               then
                 kill $mysqld_pid
                 sleep 2
             fi
        fi
    }
    
    restart(){
        printf "Restarting MySQL...
    "
        stop
        sleep 2
        start
    }
    
    case "$1" in
        start)
            start
        ;;
        stop)
            stop
        ;;
        restart)
            restart
        ;;
        *)
            printf "Usage: /data/${port}/mysql {start|stop|restart}
    "
    esac

    注意脚本要给继续权限才能够正常使用

      第二个里程碑:创建数据目录并授权

    [root@db02 /]# mkdir /data/{3306,3307}/data -p
    [root@db02 /]# chown -R mysql.mysql /data/

      第三个里程碑:初始化数据

    cd /application/mysql/scripts  && 
    ./mysql_install_db  --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
    ./mysql_install_db  --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql

      第四个里程碑:创建日志文件

    #5.6.40特殊性:需要创建错误日志文件

    touch /data/3306/mysql_3306.err
    touch /data/3307/mysql_3307.err

      第五个里程碑:启动多实例

    [root@db02 scripts]# /data/3306/mysql start
    Starting MySQL...
    [root@db02 scripts]# /data/3307/mysql start
    Starting MySQL...

    检查mysql状态

    [root@db02 scripts]# ps -ef |grep [my]sql 
    root       4341      1  0 16:46 pts/1    00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf --pid-file=/data/3306/3306.pid
    mysql      4526   4341 13 16:46 pts/1    00:00:03 /application/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data 
    --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3306/mysql_3306.err --pid-file=/data/3306/3306.pid --socket=/data/3306/mysql.sock --port=3306 root 4549 1 0 16:46 pts/1 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf --pid-file=/data/3307/3307.pid mysql 4734 4549 51 16:46 pts/1 00:00:08 /application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data
    --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3307/mysql_3307.err --pid-file=/data/3307/3307.pid --socket=/data/3307/mysql.sock --port=3307

    检查端口信息

    [root@db02 scripts]# netstat  -lntup |grep mysql 
    tcp        0      0 :::3306                     :::*                        LISTEN      4526/mysqld         
    tcp        0      0 :::3307                     :::*                        LISTEN      4734/mysqld

    至此mysql的多实例就配置完成    

    2.4.5 多实例mysql的使用

    本地连接方式

    mysql -S /data/3306/mysql.sock
    mysql -S /data/3307/mysql.sock

    2.4.6 关于mysql多实例的选择

    1、资金紧张性公司的选择 
      资金紧张,公司业务访问量又不大,但又希望不同的业务的数据库服务各自尽量独立 
    2、并发访问不是特别大的业务 
      当公司业务访问量不太大的时候,服务器的资源基本都是浪费的,这就适合多实例的使用 
    3、门户网站应用MySQL多实例场景 
      配置硬件好的服务器,可以节省IDC机柜空间,跑多实例也不会减少硬件资源不慢的浪费 
      一般是从库多实例,例如:某部门使用IBM服务器为48核CPU,内存96GB、一台服务器跑3~4个实例:
    此外,sina网也是用的多实例,内存48GB左右。企业环境中一般将多实例应用在测试环境。

    2.5 mysql忘记密码怎么办?

    第一步:将服务停掉

    /etc/init.d/mysqld stop

    第二步:加参数启动服务

    cd /application/mysql/bin/ 
    mysqld_safe --skip-grant-table --user=mysql --skip-networking &

    这种模式下
      无密码登陆
      网络用户无法登陆
      只能本地登陆
      和授权有关的命令都无法执行

    第三步:修改密码

    [root@db02 3306]# mysql
    mysql> update mysql.user set password=password('123') where user='root' and host='localhost';
    mysql> flush privileges;

    MYSQL5.7 修改密码修改字段  authentication_string

    第四步:退出重启服务

    /etc/init.d/mysqld restart

    第五步:登录验证

    mysql -uroot -p123

    至此密码修改成功

    2.6 参考文献

    https://zh.wikipedia.org/wiki/MySQL#%E6%AD%B7%E5%8F%B2  mysql历史
    http://blog.51cto.com/oldboy/1728380   MySQL常见错误代码(error code)及代码说明
    https://www.abcdocker.com/abcdocker/28   MySQL入门介绍
    https://www.abcdocker.com/abcdocker/90   MySQL多实例
    http://oldboy.blog.51cto.com    脚本来源
  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/tu240302975/p/13387128.html
Copyright © 2020-2023  润新知