• mysql简介


     MYSQL

      1、MySQL介绍
    MySQl是一个真正的多线程多用户的SQL数据库服务软件,凭借其查询速度快高性能、高可靠和易于使用等特性,成为服务器领域中最受欢迎的开源关系型数据库系统
       2、MySQL与Maria DB:
    Maria DB数据库管理是MySQL的一个分支,主要由开源社区维护,采用GPL授权许可。Maria DB的目的是完全兼容MySQL,包括API和命令行,使之轻松的成为MySQL的替代品。
    Maria DB直到5.5版本,均依照MySQL的版本。从2012年11月12日起发布的10.0.0版开始,不在依照MySQL的版号了。10.0.x版以5.5版为基础,加上移植MySQL 5.6版的新功能和自行开发的新功能。
     3、数据库类型
    关系型数据库管理系统(RDBMS):
     商业:Oracle、Sybase、Infomix、SQL Server、DB2
     开源:MySQL、PostgreSQL、pgsql、EnterpriseDB
     银行软件:
     操作系统:AIX(IBM--》Unix 小机) RedHat
     数据库:Oracle DB2
     中间件:Weblogic  Websphere  Jboss
    非关系型数据库NoSQL:
     MongoDB、Redis、HBase、Memcached
      4、MySQL版本:
    Community Edtion 社区版,免费,由社区人员维护、测试及更新
    Enterprise  Edtion 企业版,收费,MySQL官方维护团队人员维护、测试及更新
      5、数据库的基本概念:
    1)MySQL是一套关系型数据库管理系统,在每台MySQL服务器中,均支持运行多个数据库(文件系统中的目录),每一个库相当于一个容器,其中存放着许多数据表,表中的每一行包含一条具体的数据关系信息,这些信息被称为数据记录
    数据:
    描述事物的符号记录为数据
    包括文字、数字、图形、图像、声音等
    以记录的形式按统一的格式进行储存
    数据表:
    将不同的记录组织在一起,就形成了表
    是用来存储具体数据的
    数据库:
    数据库就是表的集合,是存储数据表的仓库
    以一定的组织方式存储的互相有关的数据
    2)MySQL数据库的数据文件存放在/usr/local/mysql/data中,每个子目录对应一个数据库,在MyISAM存储引擎时每个表对应三个文件:
    uesr.frm     表的结构定义
    user.MYD    表的数据
    user.MYI     表的索引
    3)新建的数据库有以下表,
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema  |保证兼容性,运行在内存中,
    | mysql              |保存了用户相关信息
    | performance_schema |性能相关
    | test                |空的
    +--------------------+
    6、安装mariadb:
    [root@localhost ~]# yum -y install mariadb mariadb-server
    [root@localhost ~]# systemctl restart mariadb
    MySQL数据库系统也是典型的c/s(客户端/服务端)架构的应用,连接时需要专用的客户端工具,Linux下通过mysql命令工具连接并登录到MySQL操作环境
    MySQL选项:
    -u:用户名
    -p:指定密码
    -h:指定主机
    -P:指定端口
    -S:指定Socket文件
    -e:指定SQL命令语句(非交互)
    默认情况下,新安装的 mariadb 的密码为空,在shell终端直接输入 mysql 就能登陆数据库。
    如果是刚安装第一次使用,请使用 mysql_secure_installation 命令初始化
    7、SQL语句分类:
    1、数据定义语言(DDL)
    创建、修改或删除数据库中各种对象,包括表、视图、索引等。
    命令:CREATE TABLE,CREATE VIEW,CREATE INDEX,ALTER TABLE,DROP TABLE,DROP VIEW,DROP INDEX;
    2、查询语言(DQL)
    按照指定的组合、条件表达式或排序检索已存在的数据库中数据,不改变数据库中的数据。
    命令:SELECT……FROM……WHERE……
    3、数据操纵语言(DML)
    对已经存在的数据库进行元组的插入、删除、修改等操作
    命令:INSERT、UPDATE、DELETE
    4、数据控制语言(DCL)
    用来授予或回收访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视
    命令:GRANT、REVOKE、COMMIT、ROLLBACK
    8、数据库密码:
    1、设置初始密码:
    mysqladmin -uroot password ‘123123’
    2、后期修改密码
    mysqladmin -uroot -p‘旧密码’ password ‘新密码’
    3、破解root密码
    > 表示在数据库内输入
    关闭MySQL
    systemctl stop mysqld
    跳过加载授权表过程
    mysqld_safe --skip-grant-tables &
    mysql
    > update mysql.user set authentication_string=passeord(‘123123’) where user=’root’;
    > flush privileges;
    > exit
    关闭数据库然后重启
    systemctl stop mysqld
    systemctl restart mysqld
    然后通过新密码登录
    9、SQL语句:
    显示当前用户:select user();
    查看服务器信息:status
    查看数据库:show databases;
    切换数据库:use mysql
    显示当前数据库:select database();
    查看表:show tables;
    显示数据表的结构:describe [数据库名.]表名; describe可简写为desc
    创建数据库:create database 数据库名;
    创建数据库:create table usera(列名 类型,列名2 类型,primary key(列名));
    删除表:drop table 表名;
    删除数据库:drop database 数据库名;
    向表中添加数据:insert into 表名(列名1,列名2)values (列1的值,列2的值);
    查询表中的数据:select 列名,.... from 表名 where 条件表达式
    修改、更新表中的数据:update 表名 set 列名=新值 where 条件表达式
    删除表中数据:delete from 表名 where 条件表达式;
    查看服务器状态:show status;
    查看命令帮助:help 命令
    查看当前登录用户:show grant;
    显示服务器错误信息:show errors;
    显示服务器警告信息:show warnings;
    显示当前时间:select now ();
    10、MySQL权限管理:
    MySQL数据库的root用户账户拥有对所有库,表的全部权限,频繁使用root账号会给数据库服务器带来一定的安全风险,实际工作中,通常会建立-些低权限的用户,只负责一部分库,表的管理和维护操作,甚至可以对查询,修改,删除记录等各种操作做进一步的细化限制,从而降低数据的风险。
    权限列表:用于列出授权的各种数据库操作,通过逗号进行分割,如: select,insert,update等,al表示所有权限,可以执行任意操作。
    库名.表名 :用于指定授权操作的数据库和表的名称,可以使用通配符(* )表示所有
    用户名@来源地址:用于指定用户和允许访问的客户机地址;来源地址可以是IP地址,域名, %通配符表示所有( 但不能表示localhost )
    MySQL通配符:
    _:任意单个字符
    %:任意长度的任意字符
    命令格式:
    设置用户权限:grant 权限列表 on 数据库名。表名 to 用户名@来源地址 [identified by ‘密码’];
    查看用户权限:show grants for 用户名@域名或IP
    撤销用户权限:revoke 权限列表 on 数据库名.表名 from 用户名@域名或IP
    授权windows客户机拥有访问权限:
    grant all on *.* to ‘root’@’192.168.200.2’ identified by ‘123123’;
    flush privileges;
     
     
     
    11、基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
       1) MySQL多实例的原理
    mysql多实例,简单理解就是在一台服务器上,mysql服务开启多个不同的端口(如3306、3307、3308)运行多个服务进程。这些 mysql 服务进程通过不同的 socket来监听不同的数据端口,进而互不干涉的提供各自的服务。
    在同一台服务器上,mysql 多实例会去共用一套 mysql 应用程序,因此你在部署 mysql 的时候只需要部署一次 mysql程序即可,无需多次部署。但是,mysql多实例之间会各自使用不同的 my.cnf 配置文件、启动程序和数据文件。在提供服务方面,mysql多实例在逻辑上看起来是各自独立,互不干涉的,并且多个实例之间是根据配置文件的设定值,来获取相关服务器的硬件资源。
       2)优点:
    有效利用服务器资源
    当单个服务器资源过剩时,可以充分利用剩余的资源来提供更多的服务
    节约服务器资源
    当公司资金紧张,但数据库又需要数据库之间各自提供服务时,并且还想使用主从同步等技术,此时多实例就再好不过了
    方便后期架构扩展
    当公司的某个项目才启动时,启动初期并不一定有很大的用户量,因此可以先用一组物理数据库服务器,在上面部署多个实例,方便后续架构扩展、迁移
      3) 缺点:
    资源互相抢占问题
    当某个服务实例并发很高或者有慢查询时,整个实例会消耗更多的内存、CPU和IO资源,这将导致服务器上的其它实例提供服务的质量下降
     4) mysql 多实例在生产环境下的应用场景!
    当一个公司业务访问量不太大,又想节俭成本,并且还希望不同业务的数据库服务能够各自尽量独立,提供服务能够互相不受影响。另外还需要应用主从同步等技术来提供数据库备份或读写分离服务,以及方便后期业务量增大时,数据库架构的扩展和迁移。此时,Mysql 多实例就再好不过了。比如,我们可以通过在 3 台服务器部署 6-9 个实例,然后交叉做主从同步备份及读写分离,来实现 6-9 台服务器才能够达到的效果
    公司业务访问量不是太大的时候,服务器的资源基本都是过剩状态。此时就很适合 mysql 多实例的应用。如果对 SQL语句优化做的比较好,mysql 多实例是一个很值得去使用的技术。即使后期业务并发很大,只要合理分配好系统资源,也不会有太大的问题
    为了规避 mysql 对 SMP 架构不支持的缺陷,我们可以使用 mysql 多实例绑定处理器的办法(NUMA处理器必须支持,不过现在大部分处理器都支持的)将不同的数据库分配到不同的实例上提供数据服务;
    传统游戏行业的 MMO/MMORPG以及Web Game,会将每个服都对应一个数据库,而且可能经常要做很多数据查询和数据订正工作。此时,为了减少维护而出错的概率,我们也可以采用多实例的部署方式,按区的概念来分配数据库。
       5) Mysql多实例实现的3种方式
          (1)基于多配置文件
    通过使用多个配置文件来启动不同的进程,以此来实现多实例。
    优点:逻辑简单,配置简单
    缺点:管理起来不方便
          (2)基于mysqld_multi
    通过官方自带的 mysqld_multi 工具,使用单独配置文件来实现多实例
    优点: 便于集中管理管理
    缺点: 不方便针对每个实例配置进行定制
          (3)基于IM
    使用 MySQL 实例管理器(MYSQLMANAGER),这个方法好像比较好不过也有点复杂
    优点:便于集中管理
    缺点:耦合度高。IM一挂,实例全挂 ,不方便针对每个实例配置进行定制
            MySQL本身就可以通过多实例方式运行,只要修改启动脚本和配置文件,把端口、basedir、datadir 文件夹分开后,多个实例的运行就会互不影响。但是这种方式操作起来太过繁杂,所以MySQL官方提供了一个mysqld_multi 的程序来辅助实现多实例操作。
        6) 多实例配置
           (1)创建并初始化数据目录
           几个实例要分开运行,必然要把数据库文件放到不同目录中,所以第一步是要建立各个实例的数据目录,这里假设我们要运行三个实例,端口分别是3306,3307,3308,为了方便维护,我们把数据文件夹也按照端口号来命名:
    [root@localhost ~]# mkdir -p /data/mysql/{3306,3307,3308}
    [root@localhost ~]# chown mysql:mysql /data/mysql/{3306,3307,3308}
    [root@localhost ~]# ls -ld /data/mysql/{3306,3307,3308}
    drwxr-xr-x 2 mysql mysql 6 12月  7 16:37 /data/mysql/3306
    drwxr-xr-x 2 mysql mysql 6 12月  7 16:37 /data/mysql/3307
    drwxr-xr-x 2 mysql mysql 6 12月  7 16:37 /data/mysql/3308
    通过配置文件指定并初始化数据目录
    [root@localhost ~]# cp /etc/my.cnf /data/mysql/3308.cnf
    [root@localhost ~]# vim /data/mysql/3308.cnf
    [mysqld]
    port=3308
    datadir=/data/mysql/3308/
    socket=/tmp/mysql3308.sock
    symbolic-links=0
    [mysqld_safe]
    log-error=/data/mysql/3308.log
    pid-file=/usr/local/mysql/data/3308.pid
     
    [client]
    port=3308
    socket=/tmp/mysql3308.sock
    [root@localhost ~]# mysqld --defaults-file=/data/mysql/3308.cnf --initialize-insecure --user=mysql
    初始化完成之后,后续的配置不需要3308.cnf文件,实例的参数会在my.cnf中集中配置。
    注意,data目录在初始化前,必须为空,不然初始化是会报错
    重复上面两个步骤,把3307、3306目录初始化好。
    [root@localhost ~]# cat /data/mysql/3306.cnf
    [mysqld]
    port=3306
    datadir=/data/mysql/3306/
    socket=/tmp/mysql3306.sock
    symbolic-links=0
     
    [mysqld_safe]
    log-error=/data/mysql/3306.log
    pid-file=/usr/local/mysql/data/3306.pid
     
    [client]
    port=3306
    socket=/tmp/mysql3306.sock
    [root@localhost ~]# cat /data/mysql/3307.cnf
    [mysqld]
    port=3307
    datadir=/data/mysql/3307/
    socket=/tmp/mysql3307.sock
    symbolic-links=0
     
    [mysqld_safe]
    log-error=/data/mysql/3307.log
    pid-file=/usr/local/mysql/data/3307.pid
     
    [client]
    port=3307
    socket=/tmp/mysql3307.sock
    [root@localhost ~]# mysqld --defaults-file=/data/mysql/3307.cnf --initialize-insecure --user=mysql
    [root@localhost ~]# mysqld --defaults-file=/data/mysql/3306.cnf --initialize-insecure --user=mysql
     
             (  2) 配置my.cnf文件集中管理多个实例
    [root@localhost ~]# cp /etc/my.cnf /etc/my.cnf.bak
    [root@localhost ~]# vim /etc/my.cnf
    [mysqld_multi]
    mysqld=/usr/local/mysql/bin/mysqld_safe
    mysqladmin=/usr/local/mysql/bin/mysqladmin
     
    [mysqld1]
    port=3306
    socket=/tmp/mysql3306.sock
    datadir=/data/mysql/3306/
    skip-external-locking
    log-bin=/data/mysql/3306/mysql-bin
    server-id=3306
    user=mysql
     
    [mysqld2]
    port=3307
    socket=/tmp/mysql3307.sock
    datadir=/data/mysql/3307/
    skip-external-locking
    log-bin=/data/mysql/3307/mysql-bin
    server-id=3307
    user=mysql
     
    [mysqld3]
    port=3308
    socket=/tmp/mysql3308.sock
    datadir=/data/mysql/3308/
    skip-external-locking
    log-bin=/data/mysql/3308/mysql-bin
    server-id=3308
    user=mysql
     
    [mysql]
    no-auto-rehash
     
    mysqld_multi的配置文件和一般MySQL配置不同,没有[mysqld]段,取而代之的是[mysqld1]、[mysqld2]等配置段,每个配置段代表一个MySQL实例。
     
           (3)管理多个MySQL实例
    1,启动多个MySQL实例
    启动多个实例时需要一个启动脚本,这个脚本一般在/usr/local/mysql/support-files目录下的mysqld_multi.server文件
    [root@localhost ~]# cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
     
    启动多个MySQL实例
    [root@localhost ~]# /etc/init.d/mysqld_multi start 1-3
     
    启动三个MySQL实例,注意这里的数字和my.cnf中的[mysqldN]对应,1-3就是启动[mysqld1]、[mysqld2]、[mysqld3]配置段的MySQL实例。
     
    [root@localhost ~]# netstat -lnpt | grep -E "3306|3307|3308"
    tcp6       0      0 :::3306                 :::*                    LISTEN      2744/mysqld        
    tcp6       0      0 :::3307                 :::*                    LISTEN      65502/mysqld       
    tcp6       0      0 :::3308                 :::*                    LISTEN      65499/mysqld
     
    查看端口,看MySQL有没有正常启动,如果没有启动或报错,一般报错详细日志存在各个实例data目录下的 主机名.err文件中,打开此文件查找错误原因,逐步排错就可以了。
     
    2,关闭多个MySQL实例
    [root@localhost ~]# /etc/init.d/mysqld_multi stop 1-3
    [root@localhost ~]# netstat -lnpt | grep -E "3306|3307|3308"
     
    也可以使用以下命令:
    killall -u mysql   或者   kill -9 the-mysql-pid
     
              (4)root账户管理
    前面初始化数据库时用的是--initialize-insecure参数,所以我们初始化的数据库,root账户是没有密码的,要先改密码为123456:
    mysqladmin -uroot password '123456' -S /tmp/mysql3306.sock
    mysqladmin -uroot password '123456' -S /tmp/mysql3307.sock
    mysqladmin -uroot password '123456' -S /tmp/mysql3308.sock
    或者:
    mysqladmin -uroot password '123456' -P3306 -h127.0.0.1
    mysqladmin -uroot password '123456' -P3307 -h127.0.0.1
    mysqladmin -uroot password '123456' -P3308 -h127.0.0.1
     
                (5)连接mysql多实例:
    [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3306.sock
    [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3307.sock
    [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3308.sock
  • 相关阅读:
    第三套三
    多线程读写共享变量时,synchronized与volatile的作用
    jQuery源代码学习笔记:构造jQuery对象
    写入位置时发生訪问冲突
    Free Editor
    大区间素数筛选 POJ2689
    HDU
    CentOS下挂载U盘
    得到当前堆栈信息的两种方式(Thread和Throwable)的纠结
    [实战]MVC5+EF6+MySql企业网盘实战(9)——编辑文件名
  • 原文地址:https://www.cnblogs.com/elin989898/p/11945719.html
Copyright © 2020-2023  润新知