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
posted @ 2019-11-29 11:20  elin菻  阅读(761)  评论(0编辑  收藏  举报