Mysql

一、概念

  1. 什么是数据库?
    数据库是“按照数据结构来组织、存储和管理数据的仓库”。MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品,常用版本 mysql5.7。
  2. 数据库能干嘛?
    数据库可以存储数据,账号,密码,存款等数据,常见的数据库有 oracle,mysql,mariadb,redis,db2 等。
  3. MySQL 版本说明
    Alpha 版本:
    是内部测试版,一般不向外发布,会有很多 Bug 一般只有测试人员使用
    Beta 版本:
    功能开发完和所有测试之后的产品,不会存在较大的功能和性能 Bug
    RC 版本:
    生产环境之前的一个小版本,根据 Beta 版本测试结果打补丁后的版本。
    GA 版本:
    是正式发布的版本
    温馨提示:
    选择发布六个月以上的 GA 版本,查看是否有连续 BUG 的版本,稳定版本一般几个月不会修复重大 BUG。
    MySQL 8.0 新增端口推荐阅读:
    https://dev.mysql.com/doc/mysql-port-reference/en/mysql-ports-reference￾tables.html#mysql-client-server-ports
  4. mysql 特点
    1. MySQL 是开源的,不需要支付额外的费用
    1. 支持大型系统,是可以处理拥有上千万条记录的大型数据库
    1. 支持多线程,充分利用 CPU 资源
    1. 使用标准的 SQL 数据语言形式
    1. 跨平台,支持多个操作系统,例如: Windows 、 MacOS 、 Linux 等
    1. 支持大型系统,是可以处理拥有上千万条记录的大型数据库

二、mysql 安装

mysql 可以跨平台,支持多个操作系统,例如: Windows 、 MacOS 、 Linux 等,本次安装使用 Linux centos 的系统版本为 mysql5.7。
在 Linux 上安装 MySQL 后,通常会在系统中生成以下文件和目录:

    1. 配置文件目录:MySQL 的配置文件通常存储在 /etc/mysql/ 或 /etc/my.cnf 目录下。主要的配置文件是 my.cnf。
    1. 数据目录:MySQL 数据库的数据文件通常存储在 /var/lib/mysql/ 目录下。这个目录包含了数据库的实际数据文件,如表数据、索引等。
    1. 日志文件目录:MySQL 的日志文件通常存储在 /var/log/mysql/ 目录下。常见的日志文件包括错误日志、查询日志等。
    1. 临时文件目录:MySQL 的临时文件通常存储在 /tmp/ 目录下。这些临时文件用于存储临时数据和操作。
    1. 安装目录:MySQL 的安装目录通常在 /usr/bin/ 或 /usr/local/mysql/ 目录下。这个目录包含了 MySQL 的可执行文件和库文件。
    1. Socket 文件目录:MySQL 的 Socket 文件通常存储在 /var/run/mysqld/ 目录下。这个 Socket 文件用于 MySQL 与客户端程序之间的通信。

(一) yum 或者 rpm

  1. 配置 yum 仓库,使用 yum 安装
1
2
3
4
5
6
7
8
9
10
11
#mysqlyum 仓库配置
yum -y install wget && wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
yum -y install mysql80-community-release-el7-7.noarch.rpm
#开启具体版本
vim /etc/yum.repos.d/mysql-community.repo
#刷新一下缓存
yum makecache
#查看一下可以安装版本
yum list |grep mysql
#安装
yum -y install mysql-community* --skip-broken
  1. 下载 rpm 包进行安装
    适合没有网络的时候安装
1
2
3
4
5
6
7
8
9
10
11
12
13
#或者自己官网下载 rpm 包进行安装下载地址
wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MYSQL-5.7/mysql-community-server-
5.7.36-1.el7.x86_64.rpm
wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MYSQL-5.7/mysql-community-client-
5.7.36-1.el7.x86_64.rpm
wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MYSQL-5.7/mysql-community-common-
5.7.36-1.el7.x86_64.rpm
wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MYSQL-5.7/mysql-community-libs-5.7.36-
1.el7.x86_64.rpm
wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MYSQL-5.7/mysql-community-libs-compat-
5.7.36-1.el7.x86_64.rpm
wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MYSQL-5.7/mysql-community-libs-compat-
5.7.36-1.el7.x86_64.rpm
  1. 安装 MySQL
    第一种方法:
1
yum -y install mysql-community*

正常安装完成
第二种方法:

1
rpm -ivh 包名
  1. 启动 mysql
1
2
3
4
#设置开机自启并立即启动
systemctl enable mysqld && systemctl start mysqld
#查看 mysql 状态
systemctl status mysqld
  1. 修改密码
    刚装完的数据库会产生一个临时密码,我们需要使用临时密码将密码修改成自己需要的密码
1
2
3
4
5
#查看临时密码
grep 'password' /var/log/mysqld.log
#修改 mysql 密码
mysqladmin -uroot -p'临时密码' password '需要修改的密码'
mysqladmin -uroot -p'o?=RfHasu7Cg' password 'Admin123.'
  1. 登录 mysql
1
2
3
4
5
6
7
mysql -h ip -P 端口 -u 用户名 -p 密码
选项参数:
-h ip 如果是在本机登录可以不用写默认即可,如果登录其他机器则使用其他机器 ip。
-P(大写) mysql 在没有修改端口时默认端口为 3306。
-u mysql 默认管理员用户为 root。
-p(小写) 使用自己的真实修改的密码。
mysql -h 127.0.0.1 -P3306 -uroot -p'Admin123.'
  1. 简单演示基本使用
    查看数据库中的库:
1
2
3
4
5
6
show databases;
--基本库讲解:
information_schema 保存服务器中的基本信息,如数据库名称权限等。
mysql 保存数据库运行时的信息,如数据库文件夹,字符集等。
performance_schema 用于监控 mysql 各类指标。
sys 也是用于存储系统指标。

创建一个自己的数据库:

1
2
3
4
5
6
7
8
create database dbtest;
--进入到数据库
use 库名
use dbtest;
--在当前库中创建一个表
create table test(id int,name verchat(50));
--查看当前库中的表
show tables;

(二) 源码包安装

源码包可以自定义设置,但是操作比较复杂

  1. 安装依赖环境
1
2
3
yum install -y cmake make gcc gcc-c++ bison ncurses ncurses-devel openssl-devel
#boost_1_59_0.tar.gz 依赖包下载
wget https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz/download
  1. 准备安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#下载 mysql 源码包
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.34.tar.gz
#创建组
groupadd mysql
#创建一个账号,属于 mysql 组,不允许登录系统
useradd -r -g mysql -s /bin/false mysql
#解压 mysql 包
tar -zxvf mysql-5.7.34.tar.gz
#进入解压好的包
cd mysql-5.7.34
#把 boost 移动到这里面
cp ../boost_1_59_0.tar.gz .
#解压 boost
tar -zxvf boost_1_59_0.tar.gz
#创建 mysql 存放目录
mkdir -p /mysql5.7/etc /mysql5.7/data /mysql5.7/man /mysql5.7/tmp /mysql5.7/logs
  1. 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#执行以下配置
[root@f2cfruryo10dalfq mysql-5.7.34]# cmake . \
-DWITH_BOOST=boost_1_59_0/ \
-DCMAKE_INSTALL_PREFIX=/mysql5.7/ \
-DSYSCONFDIR=/mysql5.7/etc/ \
-DMYSQL_DATADIR=/mysql5.7/data/ \
-DINSTALL_MANDIR=/mysql5.7/man/ \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/mysql5.7/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 #参数说明
cmake #编译之前先配置
-DWITH_BOOST #
-DCMAKE_INSTALL_PREFIX #编译安装的位置在哪里
-DSYSCONFDIR #配置文件目录
-DMYSQL_DATADIR #数据目录位置
-DINSTALL_MANDIR #
-DMYSQL_TCP_PORT #mysql 端口
-DMYSQL_UNIX_ADDR #
-DDEFAULT_CHARSET #字符集设置
-DEXTRA_CHARSETS #
-DDEFAULT_COLLATION #
  1. 安装
1
2
#编译,这个过程需要等很久
make && make install
  1. 初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#进入 mysql 目录
cd /mysql5.7 #创建一个目录
mkdir mysql-files #修改 mysql5.7 目录的属主和属组
chown -R mysql:mysql /mysql5.7 #初始化它用户使用 mysql,基础目录/mysql5.7,数据目录放在/mysql5.7/data 里,执行后会生成一个临时密码
/mysql5.7/bin/mysqld --initialize --user=mysql --basedir=/mysql5.7 --datadir=/mysql5.7/data #对数据目录进行加密 5q7=&KqUA6yA
/mysql5.7/bin/mysql_ssl_rsa_setup --datadir=/mysql5.7/data #创建错误日志,添加到 MySQL 组
touch /mysql5.7/logs/mysql_error.log
chown -R mysql.mysql /mysql5.7/logs/mysql_error.log #建立 mysql 配置文件,先备份 mv /etc/my.cnf /etc/my.cnfbak
cat >/mysql5.7/etc/my.cnf << EOF
[client] #客户端默认字符集
default-character-set=utf8
[mysqld] #服务器默认字符集
character-set-server=utf8
collation-server=utf8_general_ci #服务器 ID,在集群中每个节点必须有唯一值
server-id=1 #指定 mysql 安装目录
basedir=/mysql5.7 #指定数据目录
datadir=/mysql5.7/data #开启通用查询日志 不建议开
general_log=OFF
general_log_file=/mysql5.7/logs/mysql_general.log #开启错误日志(此文件需要先创建并属组给 mysql)
log-error=/mysql5.7/logs/mysql_error.log #开启二进制日志(以 mysql-log 开头)
log-bin=/mysql5.7/logs/mysql-log #二进制日志自动删除/过期的天数。默认值为 0,表示“没有自动删除”
expire-logs-days=10
EOF
  1. 设置开机自启
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#复制 mysql.server 到开机启动目录
cp /mysql5.7/support-files/mysql.server /etc/init.d/mysqld
#添加 mysql 服务
chkconfig --add mysqld
#开机自启 mysql 服务
chkconfig mysqld on
#启动 mysql
systemctl start mysqld
#修改密码
/mysql5.7/bin/mysqladmin -uroot -p'原临时密码' password 'admin'
#登录 mysql
/mysql5.7/bin/mysql -uroot -p'admin'
#将 mysql 创建快捷方式创建后可以直接使用 mysql 登录
ln -s /mysql5.7/bin/mysql /usr/bin/mysql

三、图形化管理工具
MySQL 图形化管理工具极大地方便了数据库的操作与管理,常用的图形化管理工具有:MySQL Workbench、
phpMyAdmin、Navicat Preminum、MySQLDumper、SQLyog、dbeaver、MySQL ODBC Connector。

  1. MySQL Workbench
    MySQL 官方提供的图形化管理工具 MySQL Workbench 完全支持 MySQL 5.0 以上的版本。MySQL Workbench 分为社区版和商业版,社区版完全免费,而商业版则是按年收费。 MySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化设计、模型建立、以及数据库管理功能。它包含了用于创建复杂的数据建模 ER 模型,正向和逆向数据库工程,也可以用于执行通常需要花费大量时间的、难以变更和管理的文档任务。 下载地址
  2. Navicat
    Navicat MySQL 是一个强大的 MySQL 数据库服务器管理和开发工具。它可以与任何 3.21 或以上版本的 MySQL 一起工作,支持触发器、存储过程、函数、事件、视图、管理用户等,对于新手来说易学易用。 其精心设计的图形用户界面(GUI)可以让用户用一种安全简便的方式来快速方便地创建、组织、访问和共享信息。Navicat 支持中文,有免费版本提供。 下载地址
  3. SQLyog
    SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。这款工具是
    使用 C++语言开发的。该工具可以方便地创建数据库、表、视图和索引等,还可以方便地进行插入、更新和删除等操作,同时可以方便地进行数据库、数据表的备份和还原。该工具不仅可以通过 SQL 文件进行大量文件的导入和导出,还可以导入和导出 XML、HTML 和 CSV 等多种格式的数据。 下载地址

四、基础概念

1.运算符

mysql 中运算符一般用做查询时候使用,在某些情况下需要进行使用,运算符种类:算术运算符,比较运算符,逻辑运算符,位运算符。

  1. 算数运算符
    算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+)、减
    (-)、乘(_)、除(/)和取模(%)运算。

    运算符 名称 作用 示例
    - 加法运算符 计算两个值或表达式的和 select 1+1
    ———- ———————- ———–
    * 减法运算符 计算两个值或表达式的差 select 3-2
    - 乘法运算符 计算两个值或表达式的积 select 2*3
    / 除法运算符 计算两个值或表达式的商 select 4/2
    % 求余运算符 计算两个值或表达式的余 select 8%2
  2. 比较运算符
    比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回 1,比较的结果为假则返回
    0,其他情况则返回 NULL。以下是常用比较运算符:

    运算符 意义
    = 等于
    != 不等于
    ——
    < 小于
    <= 小于等于
    ——–
    > 大于
    = 大于等于
  3. 逻辑运算符

    运算符 作用
    NOT 或者 ! 逻辑非
    ——
    and 或 && 逻辑与
    ——
    or 或
    ——
    xor 逻辑异或
    ——

1.4 位运算符
位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结
果从二进制变回十进制数。 以下是常见的位运算符

运算符 作用
& and
——

2.mysql 的字符集

查看字符集

1
SHOW VARIABLES LIKE 'character*%';

查看比较规则

1
2
3

SHOW VARIABLES LIKE 'collation*%';

修改字符集和比较规则

1
2
3
4
#修改这两个参数需要去 mysql 配置文件中修改,修改后重启一下数据库即可
vim /etc/my.cnf
character*set_server=utf8mb4
collation_server=utf8mb4_general_ci

修改已创建数据库和表的字符集:

1
2
3
4
--修改已经创建的数据库的字符集
alter database 库名 character set 'utf8mb4' collate 'utf8mb4_general_ci';
--修改已创建表的字符集
alter table 表名 convert to character set 'utf8mb4' collate 'utf8mb4_general_ci';

3.函数

  1. 什么是函数?
    函数在计算机中它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。能提高了代码效率 ,提高可维
    护性 。在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数,可以极大地 提高用户对数据库的管理效率 。 函数可以分为内置函数 和 自定义函数 ,内置函数系统自带,自定义函数需要我们自己定义。
    MySQL 提供的内置函数可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取
    MySQL 信息函数、聚合函数等。本记录只记录部分常用函数
  2. 日期时间函数

    获取日期、时间:

    函数 作用 用法
    CURDATE() 返回当前日期,只包含年、月、日 SELECT CURDATE() FROM DUAL;
    CURTIME() 返回当前时间,只包含时、分、秒 SELECT CURTIME() FROM DUAL;
    NOW() 返回当前系统日期和时间 SELECT NOW() FROM DUAL;

日期与时间戳的转换 :

函数 作用 用法
UNIX_TIMESTAMP() 以 UNIX 时间戳的形式返回当前时间 SELECT UNIX_TIMESTAMP(now());
UNIX_TIMESTAMP(date) 将时间 date 以 UNIX 时间戳的形式返回 SELECT UNIX_TIMESTAMP(CURDATE());
FROM_UNIXTIME(timestamp) 将 UNIX 时间戳的时间转换为普通格式的时间 SELECT FROM_UNIXTIME(timestamp);
函数 作用 用法
IF(value,value1,value2) 如果 value 的值为 TRUE,返回 value1,否则返回 value2SELECT IF(1 0,’正确’,’错误’)
IFNULL(value1, value2) 如果 value1 不为 NULL,返回 value1,否则返回 value2 SELECTIFNULL(null,’HelloWord’)
CASE WHEN 条件 1 THEN 结果 1 WHEN 条件 2THEN 结果 2…. [ELSE resultn] END 将 UNIX 时间戳的时间转换为普通格式的时间 SELECT CASE WHEN 1 > 0 THEN ‘1 0’ END
  1. 加密解密
函数 作用 用法
MD5(str) 返回字符串 str 的 md5 加密后的值,也是一种加密方式。若参数为 NULL,则会返回 NULL SELECT md5(‘123’)
SHA(str) 从原明文密码 str 计算并返回加密后的密码字符串,当参数为 NULL 时,返回 NULL。 SHA 加密算法比 MD5 更加安全 SELECT SHA(‘Tom123’)
  1. 信息函数
函数 作用 用法
VERSION() 返回当前 MySQL 的版本号 SELECT VERSION()
ONNECTION_ID() 返回当前 MySQL 服务器的连接数 SELECT CONNECTION_ID()
DATABASE() 返回 MySQL 命令行当前所在的数据库 SELECT DATABASE()
USER(),CURRENT_USER()、SYSTEM_USER(),SESSION_USER() 返回当前连接 MySQL 的用户
名,返回结果格式为“主机名 @用户名” SELECT USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER()
  1. 聚合函数
    函数 作用 用法
    COUNT() 统计总数等 SELECT COUNT(*) from table;
    AVG() 统计平均值 SELECT avg(age) from table;
    SUM() 求和 SELECT sum(wages) from table;
    MAX() 最大值 SELECT MAX(xx) from table;
    MIN() 最小值 SELECT MIN(xx) from table;

5.mysql 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
[client] #客户端设置
port=3306 #服务器监听端口,默认为 3306
socket=/usr/local/mysql/tmp/mysql.sock #Unix 套接字文件路径,默认/tmp/mysql.sock
default-character-set=utf8mb4
[mysqld] #服务端设置

## 一般配置选项

port=3306 #服务器监听端口,默认为 3306
basedir=/usr/local/mysql #MySQL 安装根目录,默认/usr/bin/mysql
datadir=/usr/local/mysql/data #MySQL 数据文件目录
socket=/usr/local/mysql/tmp/mysql.sock #Unix 套接字文件路径,默认/tmp/mysql.sock
pid-file=/usr/local/mysql/tmp/mysql.pid #服务进程 pid 文件路径
character_set_server=utf8 #默认字符集
default_storage_engine=InnoDB #默认 InnoDB 存储引擎
user=mysql

## 连接配置选项

max_connections=200 #最大并发连接数
table_open_cache=400 #表打开缓存大小,默认 2000
open_files_limit=1000 #打开文件数限制,默认 5000
max_connect_errors=200 #最大连接失败数,默认 100
back_log=100 #请求连接队列数
connect_timeout=20 #连接超时时间,默认 10 秒
interactive_timeout=1200 #交互式超时时间,默认 28800 秒
wait_timeout=600 #非交互超时时间,默认 28800 秒
net_read_timeout=30 #读取超时时间,默认 30 秒
net_write_timeout=60 #写入超时时间,默认 60 秒
max_allowed_packet=8M #最大传输数据字节,默认 4M
thread_cache_size=10 #线程缓冲区(池)大小
thread_stack=256K #线程栈大小,32 位平台 196608、64 位平台 262144

## 临时内存配置选项

tmpdir=/tmp #临时目录路径
tmp_table_size=64M #临时表大小,默认 16M
max_heap_table_size=64M #最大内存表大小,默认 16M
sort_buffer_size=1M #排序缓冲区大小,默认 256K

## Innodb 配置选项

#innodb_thread_concurrency=0 #InnoDB 线程并发数
innodb_io_capacity=200 #IO 容量,可用于 InnoDB 后台任务的每秒 I/O 操作数(IOPS),
innodb_io_capacity_max=400 #IO 最大容量,InnoDB 在这种情况下由后台任务执行的最大 IOPS 数
innodb_lock_wait_timeout=50 #InnoDB 引擎锁等待超时时间,默认 50(单位:秒)
innodb_buffer_pool_size=512M #InnoDB 缓冲池大小,默认 128M
innodb_buffer_pool_instances=4 #InnoDB 缓冲池划分区域数
innodb_max_dirty_pages_pct=75 #缓冲池最大允许脏页比例,默认为 75
innodb_flush_method=O_DIRECT #日志刷新方法,默认为 fdatasync
innodb_flush_log_at_trx_commit=2 #事务日志刷新方式,默认为 0
transaction_isolation=REPEATABLE-READ #事务隔离级别,默认 REPEATABLE-READ
innodb_data_home_dir=/usr/local/mysql/data #表空间文件路径,默认保存在 MySQL 的 datadir 中
innodb_data_file_path=ibdata1:128M:autoextend #表空间文件大小
innodb_file_per_table=ON #数据存放系统表空间还是独立表空间
innodb_log_group_home_dir=/usr/local/mysql/data #redoLog 文件目录,默认保存在 MySQL 的 datadir 中
innodb_log_files_in_group=2 #日志组中的日志文件数,默认为 2
innodb_log_file_size=128M #日志文件大小,默认为 48MB
innodb_log_buffer_size=32M #日志缓冲区大小,默认为 16MB

## MyISAM 配置选项

key_buffer_size=32M #索引缓冲区大小,默认 8M
read_buffer_size=4M #顺序读缓区冲大小,默认 128K
read_rnd_buffer_size=4M #随机读缓冲区大小,默认 256K
bulk_insert_buffer_size=8M #块插入缓冲区大小,默认 8M
myisam_sort_buffer_size=8M #MyISAM 排序缓冲大小,默认 8M
#myisam_max_sort_file_size=1G #MyISAM 排序最大临时大小
myisam_repair_threads=1 #MyISAM 修复线程
skip-external-locking #跳过外部锁定,启用文件锁会影响性能

## 日志配置选项

log_output=FILE #日志输出目标,TABLE(输出到表)、FILE(输出到文件)、NONE(不输出),可选择一个或多个以
逗>号分隔
log_error=/usr/local/mysql/logs/error.log #错误日志存放路径
log_error_verbosity=1 #错误日志过滤,允许的值为 1(仅错误),2(错误和警告),3(错误、警告和注释),默认值
为 3。
log_timestamps=SYSTEM #错误日志消息格式,日志中显示时间戳的时区,UTC(默认值)和 SYSTEM(本地系统时区)
general_log=ON #开启查询日志,一般选择不开启,因为查询日志记录很详细,会增大磁盘 IO 开销,影响性能
general_log_file=/usr/local/mysql/logs/general.log #通用查询日志存放路径

## 慢查询日志配置选项

slow_query_log=ON #开启慢查询日志
slow_query_log_file=/usr/local/mysql/logs/slowq.log #慢查询日志存放路径
long_query_time=2 #慢查询时间,默认 10(单位:秒)
min_examined_row_limit=100 #最小检查行限制,检索的行数必须达到此值才可被记为慢查询
log_slow_admin_statements=ON #记录慢查询管理语句
log_queries_not_using_indexes=ON #记录查询未使用索引语句
log_throttle_queries_not_using_indexes=5 #记录未使用索引速率限制,默认为 0 不限制
log_slow_slave_statements=ON #记录从库复制的慢查询,作为从库时生效,从库复制中如果有慢查询也将被记录

## 复制配置选项

server-id=1 #MySQL 服务唯一标识
log-bin=mysql-bin #开启二进制日志,默认位置是 datadir 数据目录
log-bin-index=mysql-bin.index #binlog 索引文件
binlog_format=MIXED #binlog 日志格式,分三种:STATEMENT、ROW 或 MIXED,MySQL 5.7.7 之前默认为
STATEMENT,之后默认为 ROW
binlog_cache_size=1M #binlog 缓存大小,默认 32KB
max_binlog_cache_size=1G #binlog 最大缓存大小,推荐最大值为 4GB
max_binlog_size=256M #binlog 最大文件大小,最小值为 4096 字节,最大值和默认值为 1GB
expire_logs_days=7 #binlog 过期天数,默认为 0 不自动删除
log_slave_updates=ON #binlog 级联复制
sync_binlog=1 #binlog 同步频率,0 为禁用同步(最佳性能,但可能丢失事务),为 1 开启同步(影响性能,但最安全不会
丢失任何事务),为 N 操作 N 次事务后同步 1 次
relay_log=relay-bin #relaylog 文件路径,默认位置是 datadir 数据目录
relay_log_index=relay-log.index #relaylog 索引文件
max_relay_log_size=256M #relaylog 最大文件大小
relay_log_purge=ON #中继日志自动清除,默认值为 1(ON)
relay_log_recovery=ON #中继日志自动恢复
auto_increment_offset=1 #自增值偏移量
auto_increment_increment=1 #自增值自增量
slave_net_timeout=60 #从机连接超时时间
replicate-wild-ignore-table=mysql.% #复制时忽略的数据库表,告诉从线程不要复制到与给定通配符模式匹配的表
skip-slave-start #跳过 Slave 启动,Slave 复制进程不随 MySQL 启动而启动

## 其他配置选项

#memlock=ON #开启内存锁,此选项生效需系统支持 mlockall()调用,将 mysqld 进程锁定在内存
中,防止遇到操作系统导致 mysqld 交换到磁盘的问题
lower*case_table_names=1 #设置不区分大小写
[mysqldump] #mysqldump 数据库备份工具
quick #强制 mysqldump 从服务器查询取得记录直接输出,而不是取得所有记录后将它们缓存到内存中
max_allowed_packet=16M #最大传输数据字节,使用 mysqldump 工具备份数据库时,某表过大会导致备份失败,需要增大
该值(大>于表大小即可)
[myisamchk] #使用 myisamchk 实用程序可以用来获得有关你的数据库表的统计信息或检查、修复、优化他们
key_buffer_size=32M #索引缓冲区大小
myisam_sort_buffer_size=8M #排序缓冲区大小
read_buffer_size=4M #读取缓区冲大小
write_buffer_size=4M #写入缓冲区大小

6.基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#客户端设置
[client]
#mysql 服务配置
[mysqld] #服务器监听端口,默认为 3306
port=3306 #数据存储位置
datadir=/var/lib/mysql
#Unix 套接字文件路径
socket=/var/lib/mysql/mysql.sock
#MySQL 服务唯一标识,开启二进制日志,做主从时需要
server-id=1
log-bin=mysql-bin #不会跟随符号链接
symbolic-links=0 #日志路径
log-error=/var/log/mysqld.log #服务进程 pid 文件路径
pid-file=/var/run/mysqld/mysqld.pid
#mysql 字符集设置
character_set_server=utf8mb4
#mysql 比较规则设置
collation_server=utf8mb4_general_ci

五、sql 语言

1.sql 语言概述

  1. 什么是 sql 语言?
    sql 语言(结构化查询语言),主要用于存储数据,查询数据,更新数据,管理数据库系统。sql 语言由 IBM 开发。
    sql 语言 定义
    DDL 语句 数据库定义语言:用于定义数据库,表,索引,视图,存储过程,
    DML 语句 数据库操纵语言:插入数据 insert,删除数据 delete,更新数据 update
    DQL 语句 数据库查询语言:查询数据 select
    DCL 语句 数据库控制语言:定义数据库、表、字段、用户的访问权限和安全级别
  2. sql 语言的基本规则
  • 1 SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
  • 2 每条命令以 ; 或 \g 或 \G 结束
  • 3 关键字不能被缩写也不能分行
  • 4 关于标点符号:
    • 必须保证所有的()、单引号、双引号是成对结束的
    • 必须使用英文状态下的半角输入方式
    • 字符串型和日期时间类型的数据可以使用单引号(’ ‘)表示
    • 列的别名,尽量使用双引号(” “),而且不建议省略 as
  1. sql 语言基本规范
  • 1 MySQL 在 Windows 环境下是大小写不敏感的
  • 2 MySQL 在 Linux 环境下是大小写敏感的
    • 数据库名、表名、表的别名、变量名是严格区分大小写的
    • 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
  • 3 推荐采用统一的书写规范:
    • 数据库名、表名、表别名、字段名、字段别名等都小写
    • SQL 关键字、函数名、绑定变量等都大写
  1. sql 注释
  • 1 单行注释:#注释文字(MySQL 特有的方式)
  • 2 单行注释:– 注释文字(–后面必须包含一个空格。)
  • 3 多行注释:/_ 注释文字 _/
  1. 命名规则
  • 1 数据库、表名不得超过 30 个字符,变量名限制为 29 个
  • 2 必须只能包含 A–Z, a–z, 0–9, *共 63 个字符
  • 3 数据库名、表名、字段名等对象名中间不要包含空格
  • 4 同一个 MySQL 软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  • 5 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在 SQL 语句中使用(着重号)引起来
  • 6 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了

2.DDL

DDL 数据库定义语言:语句关键字包括 CREATE,DROP , ALTER,RENAME,TRUNCATE 等。是用于定义数据库对象(如
表、索引、视图等)的一组 SQL 命令 。

  1. 创建和管理数据库
    创建数据库:
1
2
3
4
5
6
--方式 1:创建数据库
CREATE DATABASE 数据库名;
--方式 2:创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
--方式 3:判断数据库是否已经存在,不存在则创建数据库( 推荐 )
CREATE DATABASE IF NOT EXISTS 数据库名;

使用数据库:

1
2
3
4
5
6
7
8
9
10
--查看当前所有的数据库
SHOW DATABASES; #有一个 S,代表多个数据库
--查看当前正在使用的数据库
SELECT DATABASE();
--查看指定库下所有的表
SHOW TABLES FROM 数据库名;
--查看数据库的创建信息
SHOW CREATE DATABASE 数据库名;
--使用/切换数据库
USE 数据库名;

修改数据库 :

1
2
3
4
5
6
7
--更改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8 等
删除数据库:
--方式 1:删除指定的数据库
DROP DATABASE 数据库名;
--方式 2:删除指定的数据库( 推荐 )
DROP DATABASE IF EXISTS 数据库名;
  1. 创建和管理表
    数据类型:一般在创建表的时候给每个字段设置一个数据类型,以下是常见的数据类型
    数据类型 描述
    INT 从-2^31 到 2^31-1 的整型数据。存储大小为 4 个字节
    CHAR(size) 定长字符数据。若未指定,默认为 1 个字符,最大长度 255
    VARCHAR(size) 可变长字符数据,根据字符串实际长度保存,必须指定长度
    FLOAT(M,D)单精度,占用 4 个字节,M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30,默认 M+D<=6
    DOUBLE(M,D) 双精度,占用 8 个字节,D<=M<=255,0<=D<=30,默认 M+D<=15
    DECIMAL(M,D) 高精度小数,占用 M+2 个字节,D<=M<=65,0<=D<=30,最大取值范围与 DOUBLE 相同
    DATE 日期型数据,格式’YYYY-MM-DD’
    BLOB 二进制形式的长文本数据,最大可达 4G
    TEXT 长文本数据,最大可达 4G

创建表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--语法
CREATE TABLE [IF NOT EXISTS] 表名(
字段 1, 数据类型 [约束条件] [默认值],
字段 2, 数据类型 [约束条件] [默认值],
字段 3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);
--创建表示例
CREATE TABLE table1 (t*id INT,t_name VARCHAR(20),salary DOUBLE,birthday DATE);
--查看表结构
DESC table1;
--查看数据表结构
SHOW CREATE TABLE table1;
--重命名表名
RENAME TABLE table1 TO mytable;

修改表:

1
2
3
4
5
6
7
8
9
10
11
12
--追加一个列
ALTER TABLE 表名 ADD 字段名 字段类型;
ALTER TABLE table1 ADD job_id varchar(15);
--修改一个列
ALTER TABLE 表名 MODIFY 字段名 1 字段类型;
ALTER TABLE table1 MODIFY t_name VARCHAR(30);
--重命名一个列
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
ALTER TABLE table1 CHANGE t_name t1_name varchar(15);
--删除一个列
ALTER TABLE 表名 DROP COLUMN 字段名
ALTER TABLE table1 DROP COLUMN job_id;

删除表:

1
2
3
4
5
--此操作不能回滚,谨慎操作
--方法一
DROP TABLE [IF EXISTS] table1;
--方法二
DROP TABLE table1;

清空表:

1
2
3
4
5
6
--此操作不能回滚,谨慎操作
TRUNCATE TABLE 表名;
TRUNCATE TABLE table1;
--可以回滚
DELETE FROM 表名;
DELETE FROM table1;

3.DML

数据库操纵语言:插入数据 insert,删除数据 delete,更新数据 update

  1. 插入数据 insert
1
2
3
4
5
6
7
8
--方式 1:为表的所有字段按默认顺序插入数据
INSERT INTO 表名 VALUES (value1,value2,....);
insert into mytable value (1,'hhh',3000,'2000-01-01');
--方式 2:指定字段添加
insert into mytable (t_id,t_name) value (2,'aaa');
--方式 3:同时添加多条
insert into mytable value (3,'bbb',3000,'2000-01-01'),(4,'ccc',3000,'2000-01-01');
insert into mytable (t_id,t_name) value (5,'ddd'),(6,'eee');
  1. 删除数据 delete
1
2
3
4
5
--删除数据
delete 表名 where 条件;
delete mytable where t_id =6;
--如果省略 WHERE 子句,则表中的全部数据将被删除
delete 表名;
  1. 更新数据 update
1
2
3
--修改表数据
update 表名 set 修改内容 where 修改条件;
update mytable set t_name='fff' where t_id=2;

4.DQL

DQL 主要是 select,用于数据库查询数据,使用频率最多。

  1. select 最基本的语法
1
2
3
4
5
6
7
8
9
10
--基本语法
select \* from 表名;或者 select 字段一,字段二 from 表名;
select \_ from table;
参数讲解:
SELECT 标识选择哪些列

* 列出所有字段
FROM 标识从哪个表中选择
--最基本的查询
select 1+1,1*2 from dual; --dual 属于伪表
  1. 列的别名
1
2
3
4
5
6
--查询一些数据时,我们想重新给字段设置一个名字,我们就可以使用别名。别名可以紧跟列名,也可以在列名和别名之间加
入关键字 AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写
--使用 as 用法
select name as 姓名,age as 年龄 from table;
--不使用 as
select name 姓名,age 年龄 from table;
  1. 去除重复项
1
2
3
--默认情况下,查询会返回全部行,所以很有可能出现很多重复项比如通话记录中电话号码就会很多重复,可以使用关键字
DISTINCT 去除重复项
SELECT DISTINCT phone FROM table;
  1. 查询常数
1
2
--查询有些数据时,想在查询结果添加一个字段就需要使用查询常数,比如每一行都加一个性别
select name,'男' from table;
  1. where 条件查询
1
2
--查询数据时,需要筛选过滤一些数据就可以使用 where 条件语句。比如查找年龄 18 岁以上的人员
select * from table where age>18;
  1. ORDER BY 排序
1
2
3
4
5
6
7
--查询数据时,需要对查询的数据进行排序可以使用 ORDER BY 进行排序,ORDER BY 子句在 SELECT 语句的结尾
--排序规则:使用 ORDER BY 子句排序,ASC(升序),DESC(降序)默认排序是 asc。
--单列排序
select _ from table order by id;
select _ from table order by id desc;
--多列排序
select _ from table order by id,age desc;
  1. limit 分页
1
2
3
4
5
--查询数据时,不想加载所有数据我们可以使用 limit 进行分页
--查询前 10 行数据
select _ from table limit 10;
--查询 20 到 30 行的数据
select _ from table limit 20,30;
  1. 多表查询
1
2
--在正常环境中我们不会把所有数据放在同一张表中,会存放在多张表里面比如学生表和教师表,但是又想查询每个学生对应的老师就需要用到多表查询,多表查询一般两个表都需要有相互关联的字段
select _ from student s,tecaher t where s.tid=s.tid;
  1. GROUP BY 分组
1
2
--在查询时需要对某一个字段进行分组可以使用 group by,比如查询每个部门平均工资
SELECT departmentid, AVG(salary) FROM employees GROUP BY departmentid;
  1. 子查询
1
2
--子查询是指在 SQL 查询语句中嵌套使用的查询语句。子查询也被称为内部查询或嵌套查询。子查询可以出现在 SELECT、INSERT、UPDATE 或 DELETE 语句中的 WHERE 子句中,用于提供更复杂的查询逻辑和过滤条件。
select _ from table1 where table1.id in (select _ from table2);

5.DCL

数据库控制语言:定义数据库、表、字段、用户的访问权限和安全级别

  1. 查看权限
1
2
3
4
5
6
--查看权限列表
SHOW PRIVILEGES;
--查看当前用户的权限
show grants;
--查看某个用户的权限
SHOW GRANTS FOR '用户名';
  1. 权限列表
    权限分布 可设置的权限
    表权限 SELECT、INSERT、UPDATE、DELETE 等
    列权限 SELECT、INSERT、UPDATE 等
    过程权限 对存储过程的执行权限
  2. 赋予权限
1
2
3
4
5
6
7
8
9
10
11
12
--语法
GRANT 权限 1,权限 2,... on 数据库名.表名 to '用户名'@'用户地址' IDENTIFIED BY '密码';
GRANT select,update ON mydb.mytable TO 'test'@'%';
--赋予所有的权限
GRANT ALL PRIVILEGES ON _._ TO 'test'@'%';
--注意:给其他用户赋予了所有权限之后,其他用户是不可以对另外的用户进行赋予权限的,这就是和 root 的区别,如果需要
给普通用户赋予权限的需求可以使用 WITH GRANT OPTION
--语法
GRANT 权限列表 ON 库名.表名 TO '用户名'@'客户端主机 ip' IDENTIFIED BY '密码' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON _._ TO 'root'@'%'IDENTIFIED BY 'Admin123.' WITH GRANT OPTION;
--最终需要刷新
FLUSH PRIVILEGES;
  1. 收回权限
1
2
3
4
5
--语法
REVOKE 权限 1,权限 2,... ON 数据库名.表名 TO '用户名'@'用户地址' IDENTIFIED BY '密码';
REVOKE ALL PRIVILEGES ON _._ TO 'root'@'%'IDENTIFIED BY 'Admin123.' WITH GRANT OPTION;
--最终需要刷新
FLUSH PRIVILEGES;

六、用户管理

MySQL 的用户是用来管理数据库和表,mysql 把用户分成普通用户和 root 用户,root 用户是超级管理员拥有所有权
限。

1.查看,创建,修改,删除用户

  1. 查看数据库中的用户
1
SELECT user,host,authentication_string from mysql.user;
  1. 创建用户
1
2
3
4
5
--语法
CREATE USER 用户名 IDENTIFIED BY 密码;
--示例
create user 'test' identified by 'test';
CREATE USER 'test'@'%' IDENTIFIED BY 'test';
  1. 修改用户
1
2
3
4
5
6
--方法一
update mysql.user set host='localhost' where user='test'
--方法二
ALTER USER 'test'@'localhost' IDENTIFIED BY 'test';
--修改后需要进行刷新
flush privileges;
  1. 删除用户
1
2
3
4
5
6
--方式一,删除所有的
DROP USER 用户名;
DROP USER 'test';
--方式二,指定 host 删除
DROP USER 用户名@host;
DROP USER 'test'@'localhost';

2.修改密码

1
2
ALTER USER 用户名 IDENTIFIED BY 密码;
ALTER USER 'test' IDENTIFIED BY 'Admin';

3.密码过期策略

1
2
3
4
--设置密码立即过期
alter user 用户名 password expire;
--设置过期时间
alter user 用户名 password expire interval 90 day;

七、约束

1. 什么是约束

约束是表级的强制规定。 可以在创建表时规定约束或者在表创建之后通过 ALTER TABLE 语句规定约束 。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
约束的分类:

约束类型 定义
单列约束 每个约束只约束一列
多列约束 每个约束可约束多列数据
列级约束 只能作用在一个列上,跟在列的定义后面
表级约束 可以作用在多个列上,不与列一起,而是单独定义
根据约束起的作用,约束可分为:
NOT NULL 非空约束,规定某个字段不能为空
UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
PRIMARY KEY 主键(非空且唯一)约束
FOREIGN KEY 外键约束
CHECK 检查约束
DEFAULT 默认值约束

2. 非空约束

特点:限定某个字段/某列的值不允许为空 ,非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合
非空 ,空字符串’’不等于 NULL,0 也不等于 NULL 。

  1. 创建非空约束
1
2
3
4
5
6
7
8
9
10
11
12
13
--建表时创建约束
CREATE TABLE 表名称(
字段名 数据类型,
字段名 数据类型 NOT NULL,
字段名 数据类型 NOT NULL
);
CREATE TABLE student(
id int,
name varchar(20) not null
);
--表创建好后添加
alter table 表名称 modify 字段名 数据类型 not null;
alter table student modify id int not null;
  1. 删除非空约束
1
2
3
4
5
alter table 表名称 modify 字段名 数据类型 NULL;
ALTER TABLE student MODIFY name VARCHAR(30) NULL;

alter table 表名称 modify 字段名 数据类型;
ALTER TABLE student MODIFY name VARCHAR(30);

3.唯一性约束

特点:用来限制某个字段/某列的值不能重复 。同一个表可以有多个唯一约束 ,唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。 MySQL 会给唯一约束的列上默认创建一个唯一索引 。

  1. 添加唯一约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--方法一,创建表时添加
create table 表名称(
字段名 数据类型,
字段名 数据类型 unique,
字段名 数据类型 unique key,
字段名 数据类型
);
CREATE TABLE table(
id INT UNIQUE,
name VARCHAR(100) UNIQUE,
tel cahr(11) unique key
);
--方法二,创建表时添加
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] unique key(字段名)
);
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
-- 使用表级约束语法
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
--建表后指定唯一键约束
alter table 表名称 add unique key(字段列表);
alter table 表名称 modify 字段名 字段类型 unique;
  1. 删除唯一约束
1
2
3
--查看都有哪些约束
SELECT \* FROM information_schema.table_constraints WHERE table_name = '表名';
ALTER TABLE USER DROP INDEX uk_name_pwd;

4.PRIMARY KEY 约束

特点:用来唯一标识表中的一行记录。 键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许
出现空值。 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建 。

  1. 添加主键约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--方法一,创建表时添加
create table 表名称(
字段名 数据类型 primary key, #列级模式
字段名 数据类型,
字段名 数据类型
);
create table table1(
id int primary key,
name varchar(20)
);
--方法二,创建表时添加
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] primary key(字段名) #表级模式
);
CREATE TABLE table2(
id INT NOT NULL,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd)
);
  1. 删除主键约束
1
alter table 表名称 drop primary key;

5.自增列:AUTO_INCREMENT

特点:某个字段的值自增 。一个表最多只能有一个自增长列 ,当需要产生唯一标识符或顺序值时,可设置自增长

  1. 创建自增约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--方法一,创建表时添加
create table 表名称(
字段名 数据类型 primary key auto_increment,
字段名 数据类型 unique key not null,
字段名 数据类型 unique key,
字段名 数据类型 not null default 默认值,
);
--方法二,创建表时添加
create table 表名称(
字段名 数据类型 default 默认值 ,
字段名 数据类型 unique key auto_increment,
字段名 数据类型 not null default 默认值,,
primary key(字段名)
);
--建表后
alter table 表名称 modify 字段名 数据类型 auto_increment;
  1. 删除自增约束
1
alter table 表名称 modify 字段名 数据类型;

八、视图

  1. 什么是视图
    视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
  2. 创建视图
1
2
CREATE VIEW 视图名称 AS 查询语句;
CREATE VIEW table_view AS SELECT id,name,salary FROM table;
  1. 查看视图
1
2
3
4
--查看数据库的表对象、视图对象
SHOW TABLES;
--查看视图的结构
DESC / DESCRIBE 视图名称;
  1. 修改视图
1
ALTER VIEW 视图名称 AS 查询语句
  1. 删除视图
1
2
--删除视图只是删除视图的定义,并不会删除基表的数据
DROP VIEW IF EXISTS 视图名称;

九、存储过程

  1. 什么是存储过程
    MySQL 的存储过程是一组预先编译好的 SQL 语句集合,类似于程序中的函数,可以在 MySQL 服务器上存储和执行。存储过程可以接受参数、执行 SQL 查询、控制流程、进行逻辑处理,并返回结果。存储过程可以被多次调用,提高了 SQL 代码的重用性和可维护性。
    好处:

    • 1、简化操作,提高了 sql 语句的重用性,减少了开发程序员的压力
    • 2、减少操作过程中的失误,提高效率
    • 3、减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器)
    • 4、减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性
  2. 创建存储过程

1
2
3
4
5
6
7
8
9
10
11
--语法
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
存储过程体
END
--示例
CREATE PROCEDURE select*mytable()
BEGIN
SELECT * FROM mytable;
END
  1. 存储过程的调用
1
2
CALL 存储过程名(实参列表);
call select*mytable();
  1. 删除存储过程
1
2
DROP PROCEDURE 存储过程名
DROP PROCEDURE select_mytable;

十、触发器

  1. 什么是触发器
    MySQL 触发器是一种特殊的数据库对象,它与表相关联,并在表上执行定义的操作(例如插入、更新、删除)时自
    动触发。触发器是一种用于实现数据库约束、自动化业务逻辑和数据一致性的机制。
  2. 创建触发器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--语法结构
CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
--说明
表名 :表示触发器监控的对象。
BEFORE|AFTER :表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。
INSERT|UPDATE|DELETE :表示触发的事件。
INSERT 表示插入记录时触发;
UPDATE 表示更新记录时触发;
DELETE 表示删除记录时触发。
CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--创建两个表
CREATE TABLE mytb (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(30)
);
CREATE TABLE mytb_log (
id INT PRIMARY KEY AUTO_INCREMENT,
log VARCHAR(30)
);
--创建触发器
CREATE TRIGGER mytergger
AFTER INSERT ON mytb
FOR EACH ROW
BEGIN
INSERT INTO mytb_log (log) VALUES ('mytb 表插入了新的数据');
END
--验证
insert into mytb (user_name) value ('hhh')
select * from mytb*log
  1. 查看触发器
1
2
3
4
5
6
--方式 1:查看当前数据库的所有触发器的定义
SHOW TRIGGERS\G
--方式 2:查看当前数据库中某个触发器的定义
SHOW CREATE TRIGGER 触发器名
--方式 3:从系统库 information_schema 的 TRIGGERS 表中查询“salary_check_trigger”触发器的信息。
SELECT * FROM information*schema.TRIGGERS;
  1. 删除触发器
1
DROP TRIGGER IF EXISTS 触发器名称;

十一、日志

  1. 日志分类
  • Error Log –错误日志:启动,停止,关闭失败报错。
  • General query log –所有查询都记在这里,默认关闭
  • Binary log –二进制日志:实现备份,增量备份。除了 select 都记
  • Relay log –中继日志:读取主服务器的 binlog,在本地回放,保持一致
  • slow log –慢查询日志,指导调优。
  • DDL log –定义语句的日志

十二、备份

备份分为热备份和冷备份,冷备份就是直接把文件拷走,缺点就是需要停一下数据库。
热备份也叫逻辑备份,不需要停数据也可以进行备份,缺点效率低。

1.冷备份

  1. 停止数据库
1
[root@localhost ~]# systemctl stop mysqld
  1. 将 data 目录里面的所有进行压缩
1
2
cd /var/lib/mysql
tar -zcvf `date+%F-%H`-mysql-all.tar.gz *
  1. 备份完成后重启数据库
1
systemctl start mysqld #可以使用 scp 将备份好的数据拿走,恢复直接在数据目录中解压出来

2.热备份

逻辑备份

  1. mysqldump+binlog

    mysqldump 是热备份,优点:自动记录日志,可用性一致性。

1
2
3
4
5
6
7
8
#语法
mysqldump -h 服务器 -u 用户名 -p 密码 数据库名 备份文件.sql
#实战
mysqldump -uroot -p'admin' \
--all-databases --single-transaction \ #备份所有的库,保持数据可用性
--master-data=2 \ #注释日志记录
--flush-logs \ #刷新日志
/backup/`date+%F-%H`-mysql-all.sql
  1. 数据还原
1
2
#注意数据库密码是备份文件中的密码
mysql -uroot -p'admin' < /backup/`date+%F-%H`-mysql-all.sql
  1. binlog 恢复
1
2
3
#查看最后备份时的日志文件
vim /backup/`date+%F-%H`-mysql-all.sql #后面有多少日志文件就写几个
mysqlbinlog localhost-bin.000003 日志名 --start-position=154 |mysql -p'admin'

十三、mysql 主从复制

主机名 IP 地址 操作系统 角色 硬件环境
mysql-master 192.168.134.144 centos7 主库 2Core/4GMem/50Gdisk
mysql-slave 192.168.134.145 centos7 从库 2Core/4GMem/50Gdisk

  1. 了解主从

    主从同步的作用:实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务
    主从复制需要用到 MYSQL REPLICATION,什么是 MYSQL REPLICATION?
    replication 可以实现将数据从一台数据库服务器(master)复制到一或多台数据库服务器(slave),默认情况下属于异步复制,无需维持长连接。通过配置,可以复制所有的库或者几个库,甚至库中的一些表(mysql - user 表 - 本地权限)是 MySQL 内建的,本身自带的。简单的说就是 master 将数据库的改变写入二进制日志,slave 同步这些二进制日志,并根据这些二进制日志进行数据操作
    REPLICATION 如何工作

  • (1) master 将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
  • (2) slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);
  • (3) slave 重做中继日志中的事件,修改 salve 上的数据。

    主从复制前提

    1. 主从 mysql 版本一致
    1. 主库开启 binlog 日志(设置 log-bin 参数)
    1. 主从 server-id 不同
    1. 从库服务器能连通主库
    1. 主库和从库数据一致
  1. 环境说明
  2. 配置 hosts
1
2
3
4
5
[root@localhost /]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.118 master
192.168.0.119 slave
  1. 开启二进制日志
1
2
3
4
5
vim /etc/my.cnf
log-bin=mysql-bin
server-id=1
#重启
systemctl restart mysqld
  1. 主库授权从库
1
2
3
4
5
--登录数据库
mysql -uroot -p
grant replication slave on _._ to '授权用户'@'从库 IP' identified by '授权密码';
grant replication slave on _._ to 'slave'@'192.168.134.145' identified by 'Admin123.';
flush privileges;
  1. 在 master 查看日志文件

    用于指定从库从什么位置开始进行同步,最好在备份时先执行

1
show master status\G
  1. 备份主服务器数据

    因为主从的前提是主库和从库数据一致所以需要先把主库的数据备份到从库

1
2
3
#备份
mysqldump -uroot -p'Admin123.' --all-databases --single-transaction --master-data=2 --flush￾logs>`date +%F`-mysql-all.sql #传输到从服务器
scp 2024-01-06-mysql-all.sql root@192.168.134.145:/tmp
  1. 从服务器配置
1
2
3
4
5
vim /etc/my.cnf
log-bin=mysql-bin
server-id=2
#重启
systemctl restart mysqld
  1. 从服务器恢复数据

    为了主从数据一致,需要将 master 备份好的数据导入到 slave

1
2
3
4
--临时关闭二进制日志
set sql_log_bin=0;
--恢复
source /tmp/2024-01-06-mysql-all.sql;
  1. 在从服务器设置主服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--从库配置同步参数
change master to
master_host='主库 IP',
master_user='授权用户',
master_password='授权密码',
master_port=3306,
master_log_file='mysql-bin.000001', --主库日志文件
master_log_pos=453; --position
--
change master to
master_host='192.168.134.144',
master_user='slave',
master_password='Admin123.',
master_port=3306,
master_log_file='mysql-bin.000003',
master_log_pos=154;

11.在 slave 检查同步状态

1
show slave status\G

启动主从同步

1
start slave;