MySQL多实例和SQL语句分类

对于特定环境中需要多台mysql服务器但是为了降低成本可以使用多实例

1.7. Mysql多实例

1.7.1.多实例介绍

什么是数据库多实例

MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307等),同时运行多个MySQL服务进程,这些服务进程通过不同的Socket监听不同的服务端口来提供服务。多实例可能是MySQL的不同版本,也可能是MySQL的同一版本实现

多实例的好处

可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余资源提供更多的服务,且可以实现资源的逻辑隔离节约服务器资源。例如公司服务器资源紧张,但是数据库又需要各自尽量独立的提供服务,并且还需要到主从复制等技术,多实例就是最佳选择

多实例弊端
存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者SQL查询慢时,整个实例会消耗大量的CPU、磁盘I/O等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以具体的需求要根据自己的实际情况而定。

1.7.2.Mysql多实例常见的配置方案

  • 单一的配置文件、单一启动程序多实例部署方式
    MySQL官方文档提到的单一配置文件、单一启动程序多实例部署方式
    耦合度太高,一个配置文件不好管理。不是很推荐。
  • 多配置文件、多启动程序部署方式
    多配置文件、多启动程序部署方式是针对每个实例都有独立的配置文件和目录,管理灵活,此方案耦合度较低
    工作开发和运维的统一原则:降低耦合度。所以建议的此方式

1.7.3.实战案例 :CentOS 8 实现mariadb的yum安装的多实例

1.7.3.1.实战目的

CentOS 8 yum安装mariadb-10.3.17并实现三个实例

1.7.3.2.环境要求

一台系统CentOS 8.X主机

1.7.3.3.前提准备

关闭SElinux
关闭防火墙
时间同步

1.7.3.4.实现步骤

1.7.3.4.1.安装mariadb
[root@localhost ~]#yum -y install mariadb-server
1.7.3.4.2.准备三个实例的目录
[root@localhost ~]#mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}
[root@localhost ~]#chown -R mysql.mysql /mysql          #修改目录的属主属组,否则无法正常使用
[root@localhost ~]#tree -d /mysql/
/mysql/
├── 3306
│   ├── bin
│   ├── data
│   ├── etc
│   ├── log
│   ├── pid
│   └── socket
├── 3307
│   ├── bin
│   ├── data
│   ├── etc
│   ├── log
│   ├── pid
│   └── socket
└── 3308
    ├── bin
    ├── data
    ├── etc
    ├── log
    ├── pid
    └── socket

1.7.3.4.3.生成数据库文件
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3306/data
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3307/data
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3308/data
1.7.3.4.4.准备配置文件
[root@localhost ~]#vim /mysql/3306/etc/my.cnf
[root@localhost ~]#sed 's/3306/3307/' /mysql/3306/etc/my.cnf > /mysql/3307/etc/my.cnf
[root@localhost ~]#sed 's/3306/3308/' /mysql/3306/etc/my.cnf > /mysql/3308/etc/my.cnf
[root@localhost ~]#cat /mysql/330*/etc/my.cnf
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid
[mysqld]
port=3307
datadir=/mysql/3307/data
socket=/mysql/3307/socket/mysql.sock
log-error=/mysql/3307/log/mysql.log
pid-file=/mysql/3307/pid/mysql.pid
[mysqld]
port=3308
datadir=/mysql/3308/data
socket=/mysql/3308/socket/mysql.sock
log-error=/mysql/3308/log/mysql.log
pid-file=/mysql/3308/pid/mysql.pid

1.7.3.4.5.准备启动脚本
[root@localhost ~]#vim /mysql/3306/bin/mysqld
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/bin"
mysql_basedir="/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
        printf "Starting MySQL...\n"
        ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
    else
        printf "MySQL is running...\n"
        exit
    fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
        printf "MySQL is stopped...\n"
        exit
    else
        printf "Stoping MySQL...\n"
        ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
    fi
}

function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac


[root@localhost ~]#sed 's/3306/3307/' /mysql/3306/bin/mysqld >/mysql/3307/bin/mysqld
[root@localhost ~]#sed 's/3306/3308/' /mysql/3306/bin/mysqld >/mysql/3308/bin/mysqld
[root@localhost ~]#chmod +x /mysql/3307/bin/mysqld
[root@localhost ~]#chmod +x /mysql/3308/bin/mysqld
1.7.3.4.6.启动服务
[root@localhost ~]#/mysql/3306/bin/mysqld start
Starting MySQL...
[root@localhost ~]#/mysql/3307/bin/mysqld start
Starting MySQL...
[root@localhost ~]#/mysql/3308/bin/mysqld start
Starting MySQL...

[root@localhost ~]#ss -ntl | grep 330*
LISTEN 0      80                 *:3306            *:*          
LISTEN 0      80                 *:3307            *:*          
LISTEN 0      80                 *:3308            *:*    
1.7.3.4.7.登录实例
[root@localhost ~]#mysql -uroot -S /mysql/3306/socket/mysql.sock    #指定sock登录
MariaDB [(none)]> \s;
--------------
mysql  Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:      8
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server:         MariaDB
Server version:     10.3.28-MariaDB MariaDB Server
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /mysql/3306/socket/mysql.sock
Uptime:         9 min 47 sec

Threads: 6  Questions: 4  Slow queries: 0  Opens: 18  Flush tables: 1  Open tables: 11  Queries per second avg: 0.006
--------------

ERROR: No query specified

MariaDB [(none)]> Bye


[root@localhost ~]#mysql -h127.0.0.1 -P3307         #指定端口登录
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.28-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 


#注意如果此时要停止服务需要手动输入root密码   此时初始密码为空
[root@centos8 ~]#/mysql/3308/bin/mysqld stop
Stoping MySQL...
Enter password:
1.7.3.4.8.修改root密码
[root@localhost ~]#mysqladmin -uroot -S /mysql/3306/socket/mysql.sock password 'sunxiang'
1.7.3.4.9.测试连接
[root@localhost ~]#mysql -uroot -S /mysql/3306/socket/mysql.sock    #此次不输入密码无法登录
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

[root@localhost ~]#mysql -uroot -S /mysql/3306/socket/mysql.sock -p'sunxiang'
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.3.28-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> exit
Bye

1.7.3.4.10.修改启动脚本
已经设置好密码之后,此时可以修改启动脚本,在其中添加密码信息,之后停止服务无需再次输入密码
[root@localhost ~]#cat /mysql/3306/bin/mysqld 
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd="sunxiang"
cmd_path="/usr/bin"


[root@localhost ~]#/mysql/3306/bin/mysqld stop
Stoping MySQL...
1.7.3.4.11. 开机启动
[root@localhost ~]#cat /etc/rc.d/rc.local | grep -v '#'
for i in {3306..3308};do /mysql/$i/bin/mysqld start;d

[root@localhost ~]#chmod +x /etc/rc.d/rc.local      #添加可执行权限很重要

2. SQL 语言

2.1. SQL语言的语法标准

2.1.1. 关系型数据库的常见组件

· 数据库:database

· 表:table,行:row 列:column

· 索引:index

· 视图:view

· 存储过程:procedure

· 存储函数:function

· 触发器:trigger

· 事件调度器:event scheduler,任务计划

· 用户:user

· 权限:privilege

2.1.2. SQL 语言规范

· 在数据库系统中,SQL 语句不区分大小写,建议用大写

· SQL语句可单行或多行书写,默认以 ” ; ” 结尾

· 关键词不能跨多行或简写

· 用空格和TAB 缩进来提高语句的可读性

· 子句通常位于独立行,便于编辑,提高可读性

注释:

SQL标准:

#单行注释,注意有空格
-- 注释内容 

#多行注释
/*注释内容
注释内容
注释内容*/ 

MySQL注释:

# 注释内容

2.1.3.SQL语句分类

DDL: Data Defination Language 数据定义语言
CREATE,DROP,ALTER

DML: Data Manipulation Language 数据操纵语言
INSERT,DELETE,UPDATE

软件开发:CRUD

DQL:Data Query Language 数据查询语言
SELECT

DCL:Data Control Language 数据控制语言
GRANT,REVOKE

TCL:Transaction Control Language 事务控制语言
COMMIT,ROLLBACK,SAVEPOINT

2.1.3. SQL语句构成

关健字Keyword组成子句clause,多条clause组成语句

SELECT *            #SELECT子句
FROM products       #FROM子句
WHERE price>666     #WHERE子句

获取SQL 命令使用帮助:

官方帮助:

https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html

查看SQL帮助

mysql> HELP KEYWORD

2.1.4. 字符集和排序

早期MySQL版本默认为latin1,从MySQL8.0开始默认字符集已经为 utf8mb4

建议:修改mysql8.0以前的默认字符集为utf8mb4

查看支持所有字符集

SHOW CHARACTER SET;
SHOW CHARSET;

查看支持所有排序规则

SHOW COLLATION;

#注意
utf8_general_ci不区分大小写
utf8_bin 区分大小写

查看当前使用的排序规则

SHOW VARIABLES LIKE 'collation%';

设置服务器默认的字符集

vim /etc/my.cnf         #配置文件是那个就修改哪个默认是这个
[mysqld]
character-set-server=utf8mb4

设置mysql客户端默认的字符集

vim /etc/my.cnf
#针对mysql这一特定客户端
[mysql]
default-character-set=utf8mb4

#针对所有MySQL客户端
[client]
default-character-set=utf8mb4

2.1.5.实例修改10.3.28-MariaDB服务器的默认字符集

#查看服务器的默认字符集
MariaDB [(none)]> \s;
--------------
mysql  Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:      8
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server:         MariaDB
Server version:     10.3.28-MariaDB MariaDB Server
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1              #默认为latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /mysql/3306/socket/mysql.sock
Uptime:         45 min 48 sec

Threads: 6  Questions: 6  Slow queries: 0  Opens: 18  Flush tables: 1  Open tables: 11  Queries per second avg: 0.002
--------------

ERROR: No query specified


#修改配置文件,重启服务
[root@localhost ~]#cat /mysql/3306/etc/my.cnf
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid
character-set-server=utf8mb4

[root@localhost ~]#/mysql/3306/bin/mysqld restart
Restarting MySQL...
Stoping MySQL...
Starting MySQL...



#再次查看服务器的默认字符集
MariaDB [(none)]> \s;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: *** NONE ***

--------------
mysql  Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:      8
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server:         MariaDB
Server version:     10.3.28-MariaDB MariaDB Server
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8mb4                         #修改为utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /mysql/3306/socket/mysql.sock
Uptime:         8 sec


2.1.6.实例修改10.3.28-MariaDB客户端的默认字符集

#修改客户端配置文件
[root@localhost ~]#vim /etc/my.cnf.d/client.cnf 
[client]
default-character-set=utf8mb4                                                             


#客户端登录服务器查看默认字符集
MariaDB [(none)]> \s;
--------------
mysql  Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:      9
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server:         MariaDB
Server version:     10.3.28-MariaDB MariaDB Server
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4                         #修改为utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:        /mysql/3306/socket/mysql.sock
Uptime:         6 min 53 sec