目录
[五、 SQL语言(背会)](#五、 SQL语言(背会))
[MySQL 权限对照表](#MySQL 权限对照表)
[9.1 数据备份的重要性](#9.1 数据备份的重要性)
[9.2 造成数据丢失的原因](#9.2 造成数据丢失的原因)
[9.2 备份需要考虑的问题](#9.2 备份需要考虑的问题)
[9.4 备份类型](#9.4 备份类型)
[9.5 常见的备份方法](#9.5 常见的备份方法)
[2、专用备份工具mysqldump或mysqlhotcopy (完全备份,逻辑备份)](#2、专用备份工具mysqldump或mysqlhotcopy (完全备份,逻辑备份))
[9.6 备份案例](#9.6 备份案例)
[XtraBackup 8.0.35-33 使用指南](#XtraBackup 8.0.35-33 使用指南)
[在基于 RPM 的系统上安装](#在基于 RPM 的系统上安装)
[在基于 Debian 的系统上安装](#在基于 Debian 的系统上安装)
[1. 完整备份](#1. 完整备份)
[2. 准备备份(应用日志)](#2. 准备备份(应用日志))
[3. 恢复备份](#3. 恢复备份)
[MyDumper 详细使用指南](#MyDumper 详细使用指南)
[安装 MyDumper](#安装 MyDumper)
[Ubuntu/Debian 系统](#Ubuntu/Debian 系统)
[CentOS/RHEL 系统](#CentOS/RHEL 系统)
[1. 完整备份数据库](#1. 完整备份数据库)
[2. 恢复数据库](#2. 恢复数据库)
[1. 一致性快照备份](#1. 一致性快照备份)
[2. 正则表达式过滤表](#2. 正则表达式过滤表)
[3. 备份时排除某些表](#3. 备份时排除某些表)
[4. 长查询超时设置](#4. 长查询超时设置)
[5. 只备份数据不备份结构](#5. 只备份数据不备份结构)
[mysqlhotcopy 使用指南](#mysqlhotcopy 使用指南)
[确保依赖安装(Perl 模块)](#确保依赖安装(Perl 模块))
[附录 A mysqld配置文件](#附录 A mysqld配置文件)
[附录 B mysql常见内置函数](#附录 B mysql常见内置函数)
一、概述
数据库概念
数据库(Database)
简称DB,按照一定格式存储数据的一些文件的组合,顾名思义就是存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据 。数据库管理数据有诸多优点,如降低存储数据的冗余度,存储的数据可以共享,便于维护数据完整性,能够实现数据的安全性等。数据库的发展经历了萌芽、初级、中级、和高级阶段。
数据库管理系统(DateBase Management System)
简称DBMS,数据库管理系统是专门用来管理数据库中的数据的,可以对数据库当中的数据进行增、删、改、查 等操作,常见的数据库管理系统:MySql、Oracle、MS SQLServer、DB2、sysbase等...
SQL(Structured Query Language)
结构化查询语言,针对关系型数据库的一种语言;SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL在MySql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用 。
数据库的类型
关系型数据库 (结构化存储,数据分类清晰,存储较慢)
-
MariaDB/MySQL
-
Oracle
-
DB2
-
MS SQLServer,只能用于windows系统
国产数据库
-
达梦
-
人大金仓
-
TiDB,分布式关系型数据库
-
polarDB 阿里,协议MySQL、postgreSQL
NOSQL数据库(非关系型,存储速度快)
-
Redis,缓存数据库
-
MongoDB,文档型数据库
关系型数据库模型
-
层次模型 (上下级)
-
网状模型
-
关系模型
关系模型的相关概念:
-
实体(Entity) :(方框)实体是指现实世界中可以区分的对象,它可以是具体的人、事物或概念,也可以是抽象的物体。在数据库中,实体通常对应于表中的行,而表则实体的一种集合。例如,在一个学生信息管理系统中,学生、课程和教师都可以被视为实体。
-
属性(Attribute):(圆圈)属性是实体的特征或性质,它提供了关于实体的具体信息。属性可以是简单的数据类型,如姓名、年龄或地址,也可以是更复杂的结构,如电话号码或电子邮件地址。在数据库中,属性通常对应于表中的列,每列代表实体的一种属性。例如,学生的姓名、学号和年龄都是学生的属性。
-
联系(Relationship): (菱形)联系描述了不同实体之间的关系。在现实世界中,实体之间往往存在各种形式的关联。在数据库中,联系通过关系表来实现,这个表通常包含两个或更多的实体作为表的列。例如,学生选修课程的关系表就包含了学生实体和课程实体的相关信息,描述了哪位学生选修了哪门课程。

在关系模型中,实体和联系通常通过以下三种类型来进一步分类:
-
一对一(1:1):这种联系表示两个实体之间存在一对一的关系,即每个实体只有一个相关的实体,反之亦然。例如,一个部门与一个负责人之间可能存在一对一的联系。
-
一对多(1:N):这种联系表示一个实体与多个实体相关,但每个相关实体只与一个实体相关。例如,一个教师可以教授多门课程,但每门课程只能由一个教师教授。
-
多对多(M:N):这种联系表示两个实体之间存在多对多的关系,即每个实体可以与多个实体相关,同时每个相关实体也可以与多个实体相关。例如,学生可以选修多门课程,同时每门课程也可以被多个选修。
在设计数据库时,正确地识别实体、属性和联系,以及它们之间的类型,对于创建一个结构良好、能够有效存储和检索数据的数据库至关重要。
关系数据库相关概念
-
库(Database) : 库是一个存储数据的容器 ,它可以包含多个数据库。在某些管理系统中,库等同于数据库。
-
表(Table) : 表是数据库中的一个表格,由行和列组成 。表是存储数据的主要结构,每个表通常对应一个实体类型。表的列名称为属性,而表的行名称为记录。
-
行(Record): 行也称为记录,它是表中的一个单元,代表表中的一个具体实例。每一行包含了一组属性值,这些值共同描述了一个实体的状态。
-
列(Column): 列是表中的一列,它代表了表的一个属性。每列都有一个数据类型,用于定义存储在其中的数据的种类和格式。
-
字段(Field) : 字段通常指的是表中的行与列的交叉点(单元格),它存储了单个数据项。在数据库中,每个字段都有其特定的数据类型和用途。
-
数据(Data): 数据是存储在数据库中的信息。它可以是文本、数字、日期、图像、声音等各种形式。数据是数据库管理和操作的核心。
二、安装
默认监听端口号:3306/tcp
1、mariadb安装
服务端程序: mariadb-server;客户端程序:mariadb
cs
yum install -y mariadb-server mariadb
2、mysql安装
服务端程序:mysql-server;客户端程序:mysql;
mysql的安全系数要比mariadb的高
cs
[root@mysql ~]# yum install -y mysqld-server mysql
##编译安装,需要cmake环境
关闭防火墙,设置上下文
[root@houfan ~]# systemctl disable --now firewalld
[root@houfan ~]# setenforce 0
3、启动并开机自启
cs
[root@mysql ~]# systemctl enable --now mysqld.service
4、本地连接(本地登录)
cs
[root@mysql ~]# mysql
Welcome to the mysqld monitor. Commands end with ; or \g.
Your mysqld connection id is 2
Server version: 5.5.68-mysqld mysqld Server
Copyright (c) 2000, 2018, Oracle, mysqld Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mariadb 安装会显示
mysqld [(none)]>
##[(none)]:表示当前登录用户选择的数据库的"空",没有在任何库中
##使用"exit"命令可以退出数据库登录
注意:mysqld默认的管理用户是"root",与操作系统的"root"没有任何关系!!!root用户默认没有密码!!
三、mysql数据库配置与命令
yum安装后生成的目录
cs
[root@mysql mysql]# rpm -ql mysqld-server
`/etc/logrotate.d/mysqld #配置文件
`/etc/my.cnf.d/server.cnf
/usr/bin/innochecksum #相关命令
/usr/bin/myisam_ftdump
/usr/bin/myisamchk
/usr/bin/myisamlog
/usr/bin/myisampack
/usr/bin/mysql_convert_table_format
/usr/bin/mysql_fix_extensions
/usr/bin/mysql_install_db
/usr/bin/mysql_plugin
/usr/bin/mysql_secure_installation
/usr/bin/mysql_setpermission
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysql_zap
/usr/bin/mysqlbug
/usr/bin/mysqld_multi
/usr/bin/mysqld_safe
/usr/bin/mysqld_safe_helper
/usr/bin/mysqldumpslow
/usr/bin/mysqlhotcopy
/usr/bin/mysqltest
/usr/bin/perror
/usr/bin/replace
/usr/bin/resolve_stack_dump
/usr/bin/resolveip
`/usr/lib/systemd/system/mysqld.service #运行脚本
/usr/lib/tmpfiles.d/mysqld.conf
/usr/lib64/mysql/INFO_BIN
/usr/lib64/mysql/INFO_SRC
/usr/lib64/mysql/mysqlbug
/usr/lib64/mysql/plugin
/usr/lib64/mysql/plugin/adt_null.so
/usr/lib64/mysql/plugin/auth_0x0100.so
/usr/lib64/mysql/plugin/auth_pam.so
/usr/lib64/mysql/plugin/auth_socket.so
/usr/lib64/mysql/plugin/auth_test_plugin.so
/usr/lib64/mysql/plugin/daemon_example.ini
/usr/lib64/mysql/plugin/dialog_examples.so
/usr/lib64/mysql/plugin/ha_innodb.so
/usr/lib64/mysql/plugin/ha_sphinx.so
/usr/lib64/mysql/plugin/handlersocket.so
/usr/lib64/mysql/plugin/libdaemon_example.so
/usr/lib64/mysql/plugin/mypluglib.so
/usr/lib64/mysql/plugin/qa_auth_client.so
/usr/lib64/mysql/plugin/qa_auth_interface.so
/usr/lib64/mysql/plugin/qa_auth_server.so
/usr/lib64/mysql/plugin/query_cache_info.so
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
/usr/lib64/mysql/plugin/server_audit.so
/usr/lib64/mysql/plugin/sphinx.so
/usr/lib64/mysql/plugin/sql_errlog.so
/usr/libexec/mysqld-prepare-db-dir
/usr/libexec/mysqld-wait-ready
`/usr/libexec/mysqld #myslq 启动命令
/usr/share/man/man1/innochecksum.1.gz
/usr/share/man/man1/msql2mysql.1.gz
/usr/share/man/man1/myisam_ftdump.1.gz
/usr/share/man/man1/myisamchk.1.gz
/usr/share/man/man1/myisamlog.1.gz
/usr/share/man/man1/myisampack.1.gz
/usr/share/man/man1/mysql.server.1.gz
/usr/share/man/man1/mysql_convert_table_format.1.gz
/usr/share/man/man1/mysql_fix_extensions.1.gz
/usr/share/man/man1/mysql_install_db.1.gz
/usr/share/man/man1/mysql_plugin.1.gz
/usr/share/man/man1/mysql_secure_installation.1.gz
/usr/share/man/man1/mysql_setpermission.1.gz
/usr/share/man/man1/mysql_tzinfo_to_sql.1.gz
/usr/share/man/man1/mysql_upgrade.1.gz
/usr/share/man/man1/mysql_zap.1.gz
/usr/share/man/man1/mysqlbinlog.1.gz
/usr/share/man/man1/mysqlbug.1.gz
/usr/share/man/man1/mysqlcheck.1.gz
/usr/share/man/man1/mysqld_multi.1.gz
/usr/share/man/man1/mysqld_safe.1.gz
/usr/share/man/man1/mysqldumpslow.1.gz
/usr/share/man/man1/mysqlhotcopy.1.gz
/usr/share/man/man1/mysqlimport.1.gz
/usr/share/man/man1/mysqltest.1.gz
/usr/share/man/man1/perror.1.gz
/usr/share/man/man1/replace.1.gz
/usr/share/man/man1/resolve_stack_dump.1.gz
/usr/share/man/man1/resolveip.1.gz
/usr/share/man/man8/mysqld.8.gz
/usr/share/mysql/README.mysql-cnf
/usr/share/mysql/errmsg-utf8.txt
/usr/share/mysql/fill_help_tables.sql
/usr/share/mysql/my-huge.cnf
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-large.cnf
/usr/share/mysql/my-medium.cnf
/usr/share/mysql/my-small.cnf
/usr/share/mysql/mysql_performance_tables.sql
/usr/share/mysql/mysql_system_tables.sql
/usr/share/mysql/mysql_system_tables_data.sql
/usr/share/mysql/mysql_test_data_timezone.sql
/var/lib/mysql ##mysqld数据库的数据存储目录
/var/log/mysqld
/var/log/mysqld/mysqld.log
/var/run/mysqld
mysql服务器的启动脚本
启动mysql首先初始化
cs
#如何设置MySQL成为系统服务
[root@mysql ~]# cat /usr/lib/systemd/system/mysqld.service
[Unit]
Description=mysqld database server
After=syslog.target
After=network.target
[Service]
Type=simple
User=mysql ##程序运行用户
Group=mysql
ExecStartPre=/usr/libexec/mysqld-prepare-db-dir %n
# Note: we set --basedir to prevent probes that might trigger SELinux alarms,
# per bug #547485
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
ExecStartPost=/usr/libexec/mysqld-wait-ready $MAINPID
"/usr/lib/systemd/system/mysqld.service" 48L, 1697C 39,1 55%
# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
# For example, if you want to increase mysqld's open-files-limit to 10000,
# you need to increase systemd's LimitNOFILE setting, so create a file named
# "/etc/systemd/system/mysqld.service.d/limits.conf" containing:
# [Service]
# LimitNOFILE=10000
# Note: /usr/lib/... is recommended in the .include line though /lib/...
# still works.
# Don't forget to reload systemd daemon after you change unit configuration:
# root> systemctl --system daemon-reload
[Unit]
Description=mysqld database server
After=syslog.target
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStartPre=/usr/libexec/mysqld-prepare-db-dir %n
# Note: we set --basedir to prevent probes that might trigger SELinux alarms,
# per bug #547485
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
ExecStartPost=/usr/libexec/mysqld-wait-ready $MAINPID
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
# Place temp files in a secure directory, not /tmp
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启动之后mysql生成文件目录
cs
root@houfan mysql]# systemctl start mysqld
[root@houfan mysql]# ls
auto.cnf ibdata1 mysqlx.sock.lock
binlog.000001 ibtmp1 performance_schema
binlog.index '#innodb_redo' private_key.pem
ca-key.pem '#innodb_temp' public_key.pem
ca.pem mysql server-cert.pem
client-cert.pem mysql.ibd server-key.pem
client-key.pem mysql.sock sys
'#ib_16384_0.dblwr' mysql.sock.lock undo_001
'#ib_16384_1.dblwr' mysql_upgrade_info undo_002
ib_buffer_pool mysqlx.sock
#information schema 提供数据库元数据访问(如表、列信息)
#mysql 存储用户权限、系统配置等核心数据
#performance schema 收集数据库性能指标和监控数据
#sys 简化 performance_schema的视图工具集
数据存储目录的权限
cs
[root@mysql mysql]# ls -ld /var/lib/mysql/
drwxr-xr-x 5 mysql mysql 177 1月 31 10:16 /var/lib/mysql/
服务启动时读取的默认配置文件
cs
[root@mysql mysql]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql ##定义数据存储目录
socket=/var/lib/mysql/mysql.sock ##定义连接的网络接口文件
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mysqld/mysqld.log ##程序运行的错误日志
pid-file=/var/run/mysqld/mysqld.pid ##程序运行的PID文件
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
mysqld操作命令
cs
[root@mysql ~]# ls -l /usr/bin/mysql*
-rwxr-xr-x 1 root root 3543584 10月 2 2020 /usr/bin/mysql
-rwxr-xr-x 1 root root 111971 10月 2 2020 /usr/bin/mysqlaccess
-rwxr-xr-x 1 root root 3096720 10月 2 2020 /usr/bin/mysqladmin
-rwxr-xr-x 1 root root 3259880 10月 2 2020 /usr/bin/mysqlbinlog#MySQL二进制日志
lrwxrwxrwx 1 root root 26 1月 31 10:15 /usr/bin/mysqlbug -> /etc/alternatives/mysqlbug
-rwxr-xr-x 1 root root 3094016 10月 2 2020 /usr/bin/mysqlcheck
-rwxr-xr-x 1 root root 4215 10月 2 2020 /usr/bin/mysql_convert_table_format
-rwxr-xr-x 1 root root 24116 10月 2 2020 /usr/bin/mysqld_multi
-rwxr-xr-x 1 root root 27105 10月 2 2020 /usr/bin/mysqld_safe#安全
-rwxr-xr-x 1 root root 2887144 10月 2 2020 /usr/bin/mysqld_safe_helper
-rwxr-xr-x 1 root root 3176704 10月 2 2020 /usr/bin/mysqldump
-rwxr-xr-x 1 root root 7876 10月 2 2020 /usr/bin/mysqldumpslow
-rwxr-xr-x 1 root root 3288 10月 2 2020 /usr/bin/mysql_find_rows
-rwxr-xr-x 1 root root 1246 10月 2 2020 /usr/bin/mysql_fix_extensions
-rwxr-xr-x 1 root root 34942 10月 2 2020 /usr/bin/mysqlhotcopy
-rwxr-xr-x 1 root root 3088968 10月 2 2020 /usr/bin/mysqlimport
-rwxr-xr-x 1 root root 16701 10月 2 2020 /usr/bin/mysql_install_db
-rwxr-xr-x 1 root root 2926112 10月 2 2020 /usr/bin/mysql_plugin
-rwxr-xr-x 1 root root 12126 10月 2 2020 /usr/bin/mysql_secure_installation#密码加密方式
-rwxr-xr-x 1 root root 17464 10月 2 2020 /usr/bin/mysql_setpermission
-rwxr-xr-x 1 root root 3087504 10月 2 2020 /usr/bin/mysqlshow
-rwxr-xr-x 1 root root 3106896 10月 2 2020 /usr/bin/mysqlslap
-rwxr-xr-x 1 root root 3449016 10月 2 2020 /usr/bin/mysqltest
-rwxr-xr-x 1 root root 2921448 10月 2 2020 /usr/bin/mysql_tzinfo_to_sql
-rwxr-xr-x 1 root root 2998448 10月 2 2020 /usr/bin/mysql_upgrade
-rwxr-xr-x 1 root root 2912968 10月 2 2020 /usr/bin/mysql_waitpid
-rwxr-xr-x 1 root root 3856 10月 2 2020 /usr/bin/mysql_zap
mysql命令
mysql数据库登录的命令行工具,本地登录时且root用户没有密码,输入mysql,等效于"mysql -uroot -hlocalhost -P3306"
语法
mysql [options] db_name
常用选项
-u:指定登录用户
-p:指定用户密码
-h:指定登录数据库的IP或者域名
-P:指定登录数据库的端口号 #一般使用10000以后的端口号
-e:能够在终端执行数据库指令
使用案例
cs
[root@mysql ~]# mysql -uroot -hlocalhost -P3306
[root@mysql ~]# mysql -p123.com -e "show databases" ##直接在外部执行查看数据库的命令
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
##指定登录的数据库,只能是一个
[root@mysql mysql]# mysql -p123.com mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the mysqld monitor. Commands end with ; or \g.
Your mysqld connection id is 14
Server version: 5.5.68-mysqld mysqld Server
Copyright (c) 2000, 2018, Oracle, mysqld Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysqld [mysql]>
mysqladmin命令
超级管理命令
语法
mysqladmin [options] command [command-arg] [command [command-arg]] ...
设置root用户密码
yum安装没有密码;编译安装自带密码
cs
[root@mysql ~]# mysqladmin -uroot password '123.com'
#更改密码 -p 指定新密码
[root@houfan ~]# mysqladmin -uroot -p password '1234.com'
Enter password:
使用密码登录
cs
[root@mysql ~]# mysql -uroot -p123.com -h127.0.0.1 -P3306
四、默认数据库
- **information_schema :**信息数据库,存储所有的库、表、列的名称,任意可登录数据库的用户都可读;sql注入
表名 | 作用 |
---|---|
CHARACTER_SETS | 字符集信息表。用于查看和管理MySQL数据库中的字符集信息。 |
CLIENT_STATISTICS | 客户端统计信息表。用于查看和管理客户端的统计信息,例如连接数、请求次数等。 |
COLLATIONS | 排序规则信息表。用于查看和管理MySQL数据库中的排序规则信息。 |
COLLATION_CHARACTER_SET_APPLICABILITY | 字符集和排序规则的适用性表。用于查看和管理字符集和排序规则之间的适用关系。 |
COLUMNS | 数据表的列信息表。用于查看和管理MySQL数据库中数据表的列信息。 |
COLUMN_PRIVILEGES | 列级别的权限信息表。用于查看和管理列级别的权限信息,例如用户对各个列的SELECT、INSERT、UPDATE等权限。 |
ENGINES | 存储引擎信息表。用于查看和管理MySQL数据库中支持的存储引擎信息。 |
EVENTS | 定时事件信息表。用于查看和管理MySQL数据库中的定时事件信息。 |
FILES | 文件信息表。用于查看和管理MySQL数据库服务器上文件的信息。 |
GLOBAL_STATUS | 全局状态信息表。用于查看和管理MySQL数据库服务器的全局状态信息。 |
GLOBAL_VARIABLES | 全局变量信息表。用于查看和管理MySQL数据库服务器的全局变量信息。 |
INDEX_STATISTICS | 索引统计信息表。用于查看和管理MySQL数据库中索引的统计信息。 |
KEY_CACHES | 键缓存表。用于查看和管理MySQL数据库中的键缓存信息。 |
KEY_COLUMN_USAGE | 键列使用表。用于查看和管理键列的使用情况。 |
PARAMETERS | 参数表。用于查看和管理MySQL数据库的参数信息,例如连接超时时间、最大连接数等。 |
PARTITIONS | 分区表。用于查看和管理MySQL数据库中的分区信息。 |
PLUGINS | 插件表。用于查看和管理MySQL数据库中的插件信息。 |
PROCESSLIST | 进程列表表。用于查看当前正在运行的MySQL进程,包括连接的客户端和正在执行的查询等。 |
PROFILING | 性能分析表。用于启用性能分析,记录和分析SQL查询的性能数据。 |
REFERENTIAL_CONSTRAINTS | 外键约束表。用于查看和管理外键约束的信息,包括外键列和参考列等。 |
ROUTINES | 存储过程和函数表。用于查看和管理MySQL数据库中的存储过程和函数的信息,包括创建时间、修改时间、函数名等。 |
SCHEMATA | 架构表。用于查看和管理MySQL数据库中的架构信息,包括架构名、架构下的表名等。 |
SCHEMA_PRIVILEGES | 架构权限表。用于查看和管理架构下的权限信息,包括用户对架构下表的SELECT、INSERT、UPDATE等权限。 |
SESSION_STATUS | 会话状态信息表。用于查看和管理当前会话的状态信息,例如会话的连接时间、查询时间等。 |
SESSION_VARIABLES | 会话变量表。用于查看和管理当前会话的变量信息,例如会话的最大连接数、最大内存使用量等。 |
STATISTICS | 统计信息表。用于查看和管理MySQL数据库中表的统计信息,包括表的行数、平均行大小等。 |
TABLES | 数据表信息表。用于查看和管理MySQL数据库中的数据表信息,包括表名、引擎类型等。 |
TABLESPACES | 存储空间表。用于查看和管理MySQL数据库中的存储空间信息,包括存储空间名、大小等。 |
TABLE_CONSTRAINTS | 表约束信息表。用于查看和管理表的约束信息,包括主键约束、外键约束等。 |
TABLE_PRIVILEGES | 表级别的权限信息表。用于查看和管理表级别的权限信息,例如用户对各个表的SELECT、INSERT、UPDATE等权限。 |
INNODB_CMPMEM_RESET | InnoDB 内存比较器重置表。此表用于记录 InnoDB 内存比较器(comparison memory)的清除操作。 |
INNODB_RSEG | InnoDB 重做段表此表用于记录 InnoDB 数据文件的重做段信息。 |
INNODB_UNDO_LOGS | InnoDB 撤销日志表。此表用于记录 InnoDB 撤销操作的日志信息。 |
INNODB_CMPMEM | InnoDB 内存比较器表。此表用于记录 InnoDB 内存比较器的分配和使用情况。 |
INNODB_SYS_TABLESTATS | InnoDB 系统表统计信息表。此表用于记录 InnoDB 系统表的统计信息,如数据量、碎片率等。 |
INNODB_LOCK_WAITS | InnoDB 锁等待信息表。此表记录 InnoDB 锁等待的情况,包括等待锁的线程 ID、等待时间等。 |
INNODB_INDEX_STATS | InnoDB 索引统计信息表。此表用于记录 InnoDB 索引的统计信息,如索引大小、索引列的数据类型等。 |
INNODB_CMP | InnoDB 比较器表。此表用于记录 InnoDB 比较器的分配和使用情况。 |
INNODB_CHANGED_PAGES | InnoDB 更改页表。此表用于记录 InnoDB 数据文件中已更改的页的信息。 |
INNODB_BUFFER_POOL_PAGES | InnoDB 缓冲池页表。此表用于记录 InnoDB 缓冲池中每个页的信息,包括页的类型、页的状态等。 |
INNODB_TRX | InnoDB 事务表。此表用于记录 InnoDB 事务的信息,如事务 ID、事务状态等。 |
INNODB_BUFFER_POOL_PAGES_INDEX | InnoDB 缓冲池页索引表。此表用于记录 InnoDB 缓冲池中每个页的索引信息。 |
INNODB_LOCKS | InnoDB 锁表。此表用于记录 InnoDB 锁的信息,如锁的类型、锁的持有者等。 |
INNODB_BUFFER_PAGE_LRU | InnoDB 缓冲池页 LRU 表。此表用于记录 InnoDB 缓冲池中每个页的最近最少使用(Least Recently Used,LRU)信息。 |
INNODB_SYS_TABLES | InnoDB 系统表信息表。此表用于记录 InnoDB 系统表的信息,如表名、表状态等。 |
INNODB_SYS_FIELDS | InnoDB 系统字段信息表。此表用于记录 InnoDB 系统表中每个字段的信息,如字段名、字段类型等。 |
INNODB_SYS_COLUMNS | InnoDB 系统列信息表。此表用于记录 InnoDB 系统表中每个列的信息,如列名、列类型、列长度等。 |
INNODB_SYS_STATS | InnoDB 系统统计信息表。此表用于记录 InnoDB 系统统计信息,如表数量、数据量等。 |
INNODB_SYS_FOREIGN | InnoDB 系统外键信息表。此表用于记录 InnoDB 系统表中外键的信息,如外键约束条件等。 |
INNODB_SYS_INDEXES | InnoDB 系统索引信息表。此表用于记录 InnoDB 系统表中索引的信息,如索引名、索引类型等。 |
mysql
- **mysql :**主数据库,mysqld运行的必须数据库,用户与配置信息
表名称 | 作用 |
---|---|
columns_priv | 保存了每个表的列级别的权限信息,包括用户对各个列的SELECT、INSERT、UPDATE、REFERENCES等权限。 |
db | 保存了每个数据库的权限信息,包括用户对每个数据库的CREATE、ALTER、DROP等权限。 |
event | 保存了MySQL中的事件信息,包括事件的名称、执行时间、执行语句等。 |
func | 保存了用户定义的存储函数的信息,包括函数的名称、参数、返回类型等。 |
general_log | 记录了MySQL服务器上所有的日志操作,包括查询、连接、错误日志等。 |
help_category | 保存了MySQL帮助文档中的分类信息,用于帮助查找和浏览文档。 |
help_keyword | 保存了MySQL帮助文档的关键字信息,用于快速搜索和查找文档。 |
help_relation | 保存了MySQL帮助文档中关键字之间的关系信息,用于帮助构建文档的结构。 |
help_topic | 保存了MySQL帮助文档的具体内容信息,包括每个主题的标题、内容等。 |
host | 保存了MySQL服务器上的主机信息,包括主机名、IP地址、连接权限等。 |
ndb_binlog_index | 保存了使用NDB存储引擎的MySQL服务器上的二进制日志索引信息。 |
plugin | 保存了MySQL服务器上安装的插件信息。 |
proc | 保存了用户定义的存储过程的信息,包括过程的名称、参数、语句等。 |
procs_priv | 保存了用户对存储过程的访问权限信息。 |
proxies_priv | 保存了MySQL服务器上的代理用户的权限信息。 |
servers | 实验性表,保存了MySQL服务器的外部服务器和复制配置信息。 |
slow_log | 记录了MySQL服务器上执行时间超过默认阈值的慢查询日志。 |
tables_priv | 保存了用户对表的访问权限信息。 |
time_zone | 保存了MySQL服务器上的时区信息。 |
time_zone_leap_second | 保存了时区闰秒的信息。 |
time_zone_name | 保存了时区的名称和相关信息。 |
time_zone_transition | 保存了时区的变化规则和信息。 |
time_zone_transition_type | 保存了时区变化类型的信息。 |
user | 保存了MySQL服务器上的用户账号信息,包括用户名、密码、权限等。 |
- performance_schema:性能数据库,存储mysqld的资源使用、安全策略权限配置信息
表名 | 作用 |
---|---|
cond_instances | 条件实例表,该表用于存储各种条件或锁定的实例信息 |
events_waits_current | 当前等待事件表,记录了当前正在等待某个事件发生的线程或会话信息 |
events_waits_history | 历史等待事件表,记录了过去一段时间内等待事件的信息,包括等待事件的类型、等待时间等 |
events_waits_history_long | 长期等待事件表,记录了长时间等待事件的信息,包括等待事件的类型、等待时间、等待时长等 |
events_waits_summary_by_instance | 按实例总结等待事件表,提供了按实例总结的等待事件统计信息 |
events_waits_summary_by_thread_by_event_name | 按线程和事件总结等待事件表,提供了按线程和特定事件总结的等待事件统计信息 |
events_waits_summary_global_by_event_name | 按全局和事件总结等待事件表,提供了按全局和特定事件总结的等待事件统计信息 |
file_instances | 文件实例表,记录了数据库中各个文件的信息,包括文件路径、文件大小等 |
file_summary_by_event_name | 按事件名总结文件表,提供了按特定事件名总结的文件统计信息 |
file_summary_by_instance | 按实例总结文件表,提供了按实例总结的文件统计信息 |
mutex_instances | 互斥体实例表,记录了数据库中各个互斥体的信息,包括互斥体的名称、状态等 |
performance_timers | 性能计时器表,提供了数据库性能的计时信息,包括执行时间、资源使用情况等 |
rwlock_instances | 读写锁实例表,记录了数据库中各个读写锁的信息;多个人同步操作时会出现锁,来分配优先级 |
setup_consumers | 设置消费者表,记录了数据库设置的各种消费者信息 |
setup_instruments | 设置仪器表,记录了数据库设置的各类性能指标信息 |
setup_timers | 设置定时器表,记录了数据库设置的各类定时器信息 |
threads | 线程表,记录了数据库中的各个线程信息,包括线程ID、线程状态等 |
- sys库
五、 SQL语言(背会)
- DDL:数据定义语言,对数据库结构操作
create:创建(用户,库,表)
alter:改变 (改变表的结构)
drop:删除
- DML:数据操作语言,对数据表的操作
insert:插入
update:更新
delete:删除数据
- DCL:数据控制语言,针对用户权限设置
grant:用户赋权
revoke:移除用户权限
- DQL:数据查询语言,对数据表的操作
select:查询
六、mysql数据类型
常用的数据类型有:
-
整型
-
浮点型
-
BIT类型(大数据类型)
-
定点数
-
日期时间类型
-
字符串
-
NULL类型
1、整型
整数类型 | 占用字节 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
TINYINT | 1 | 0~255 | -128~127 |
SMALLINT | 2 | 0~65535 | -32768~32767 |
MEDIUMINT | 3 | 0~16777215 | -8388608~8388607 |
INT | 4 | 0~4294967295 | -2147483648~2147483647 |
BIGINT | 8 | 0~18446744073709551615 | -9223372036854774808~9223372036854774807 |
整数列的可选属性有三个:
-
M: 宽度(在0填充的时候才有意义,否则不需要指定)
-
unsigned: 无符号类型(非负)
-
zerofill: 0填充,(如果某列是zerofill,那么默认就是无符号),如果指定了zerofill只是表示不够M位时,用0在左边填充,如果超过M位,只要不超过数据存储范围即可
在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 bytes 的存储空间。
各整数数据类型的使用场所
数据类型 | 应用场景 |
---|---|
TINYINT | 一般用于枚举数据,比如系统设定取值范围很小且固定的场景。 |
SMALLINT | 可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。 |
MEDIUMINT | 用于较大整数的计算,比如车站每日的客流量等。 |
INT、INTEGER | 取值范围足够大,一般情况下不用考虑超限问题,用得最多。比如商品编号。 |
BIGINT | 只有当你处理特别巨大的整数时才会用到。比如双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。 |
2、浮点型
数据类型 | 字节数 | 取值范围 |
---|---|---|
FLOAT | 4 | -2^128~2 ^128,即-3.40E+38~+3.40E+38 |
DOUBLE | 8 | -2^1024~ 2^1024,即-1.79E+308~1.79E+308 |
-
当浮点数类型使用unsigned修饰无符号时,取值范围将不包含负数。
-
浮点数的取值范围是理论上的极限值,但根据不同的硬件或操作系统,实际范围可能会小。
-
浮点数虽然取值范围很大,但精度并不高。float类型的精度为6位或7位,double类型的精度大约为15位。
-
如果给定的数值超出精度,可能会导致给定的数值与实际保存的数值不一致,发生精度损失。
-
当一个数字的整数部分和小数部分加起来达到7位时,第7位就会进行四舍五入操作。
-
要避免使用"="来判断两个浮点数是否相等,因为浮点数是不准确的,存在精度损失。
3、BIT类型(了解)
函数 | 函数用途 |
---|---|
BIT(M) | 存储二进制数据 |
ASCll(M) | 获取M的ASCll值 |
BIN(M) | 获取M的二进制值 |
LENGTH(M) | 获取M的数字长度 |
-
BIT数据类型可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1~64,默认为1。
-
BIT其实就是存入二进制的值,类似010110。如果存入一个BIT类型的值,位数少于M值,则左补0。如果存入一个BIT类型的值,位数多于M值,MySQL的操作取决于此时有效的SQL模式:如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。如果模式设置为traditional("严格模式"),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。
-
对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()或hex()函数进行读取。
4、定点型
-
DECIMAL在MySQL内部以字符串形式存放,比浮点数更精确。定点类型占M+2个字节
-
DECIMAL(M,D)与浮点型一样处理规则。M的取值范围为0~65,D的取值范围为0~30,而且必须<=M,超出范围会报错。
-
DECIMAL如果指定精度时,默认的整数位是10,默认的小数位为0。
-
NUMERIC等价于DECIMAL。
-
例如,DECIMAL(5,2)表示的取值范围为-999.99~999.99。
5、日期时间类型
数据类型 | 字节 | 取值范围 | 日期格式 | 零值 |
---|---|---|---|---|
YEAR | 1 | 1901~2155 | YYYY | 0000 |
DATE | 3 | 1000-01-01~9999-12-31 | YYYY-MM-DD | 0000-00-00 |
TIME | 3 | -838:59:59~838:59:59 | HH:MM:SS | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 1970-01-01 00:00:01~2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
YEAR类型
YEAR类型用来表示年份,在所有的日期时间类型中所占用的存储空间最小,只需要1个字节的存储空间,格式为YYYY。
在MySQL中,可使用以下3种格式指定TEAR类型的值:
使用4位字符串或数字表示,为1901'2155或19012155。
例如,输入2022或2022,插入到数据库中的值均为2022.
使用两位字符串表示,为00~99。
00 ~ '69的值会被转换为2000~2069的YEAR值
70 ~ '99的值会被自动转换为1970~1999的YEAR值
例如,输入22,插入到数据表中的值为2022。
使用两位数字表示,为1~99。
1 ~ 69的值会被转换为2001~2069的YEAR值
70 ~ 99的值会被自动转换为1970~1999的YEAR值
例如,输入22,插入到数据表中的值为2022。
注意:
当使用YEAR类型时,一定要区分0和0。
数字格式的0表示的YEAR值为0000
字符串格式的0表示的YEAR值为2000
DATE类型
DATE类型用来表示日期值,不包含时间部分,需要 3个字节 的存储空间,且其格式为 YYYY-MM-DD 。其中,YYYY表示年份,MM表示月份,DD表示日期。
在MySQL中,可以使用以下4种格式指定DATE类型的值:
以YYYY-MM-DD或者YYYYMMDD字符串格式表示。
以YY-MM-DD或者YYMMDD字符串格式表示。
以YY-MM-DD或者YYMMDD数字格式表示。
使用CURRENT_DATE或者NOW()输入当前系统日期。
注意:
通过"SELECT CURRENT_DATE;"或者"SELECT NOW();"可查询当前日期。
日期中的分隔符"-",还可以使用"."",""/"等符号来表示。
TIME类型
TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中HH表示小时,MM表示分,SS表示秒。
在MySQL中,可以使用以下3种格式指定TIME类型的值:
以HHMMSS字符串或者HHMMSS数学格式表示。
以HH:MM:SS字符串格式表示。
使用CURRENT_TIME或NOW()输入当前系统时间。
DATETIME类型
DATETIME类型在所有的日期时间类型中占用的存储空间最大,总共需要 8 个字节的存储空间,用来表示日期和时间,它的显示形式为YYYY-MM-DD HH:MM:SS。
在MySQL中,可以使用以下4种格式指定DATETIME类型的值:
以YYYY-MM-DD HH:MM:SS或YYYYMMDDHHMMSS字符串格式表示的日期和时间,取值范围为1000-01-01 00:00:00~9999-12-31-23-59-59。
以YY-MM-DD HH:MM:SS或YYMMDDHHMMSS字符串格式表示的日期和时间,
以YYYYMMDDHHMMSS或YYMMDDHHMMSS数字格式表示的日期和时间,
使用NOW()来输入当前系统的日期和时间。
TIMESTAMP类型
TIMESTAMP(时间戳)类型用于表示日期和时间,需要4个字节的存储空间,它的显示形式与DATETIME类型的相同,但取值范围比DATETIME类型的小。
TIMESTAMP类型与DATETIME类型的不同形式:
使用CURRENT_TIMESTAMP来输入系统当前的日期和时间。
无任何输入,或输入NULL时,实际保存的是系统当前日期和时间。
6、字符串型
数据类型 | 类型说明 |
---|---|
CHAR | 固定长度字符串 |
VARCHAR() | 可变长度字符串 |
text | 大文本数据 |
ENUM | 枚举类型 |
SET | 字符串类型 |
BINARY | 固定长度的二进制数据 |
VARBINARY | 可变长度是二进制数据 |
BLOB | 二进制大对象 |
CHAR和VARCHAR类型
CHAR和VARCHAR类型都是用来保存字符串数据,两者不同的是,VARCHAR可以存储可变长度的字符串数据。
字符串类型 | 特点 | 长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|---|
CHAR(M) | 固定长度 | M | 0<=M<=255 | M个字节 |
VARCHAR(M) | 可变长度 | M | 0<=M<=65535 | (实际长度 + 1) 个字节 |
TEXT类型
TEXT类型用于保存大文本数据,例如,文章内容,评论等比较长的文本。
数据类型 | 存储范围 | 存储空间占用量 | 特点 |
---|---|---|---|
TINYTEXT(tinytext) | 0~2^8-1 | 文本长度+2 | 小文本,可变长度 |
TEXT(text) | 0~2^16-1 | 文本长度+2 | 文本,可变长度 |
MEDIUMTEXT(mediumtext) | 0~2^24-1 | 文本长度+3 | 中等文本,可变长度 |
LONGTEXT(longtext) | 0~2^32-1 | 文本长度+4 | 大文本,可变长度 |
ENUM类型
ENUM类型又称为枚举类型,其定义格式为:
ENUM('值1','值2','值3','值4','值5',....,'值n')
-
ENUM类型的取值范围需要在定义字段时进行指定。
-
设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。
-
其所需要的存储空间由定义ENUM类型时指定的成员个数决定。
-
当ENUM类型包含1~255个成员时,需要1个字节的存储空间
-
当ENUM类型包含256~65535个成员时,需要2个字节的存储空间
-
ENUM类型的成员个数的上限为65535个
-
SET类型
SET类型用于保存字符串对象,其定义格式与ENUM类型相似。
SET('值1','值2','值3','值4','值5',....,'值n')
-
其所需要的存储空间由定SET类型时指定的成员个数决定。
SET类型包含的成员数 存储空间 1~8 1个字节 9~16 2个字节 17~24 3个字节 25~32 4个字节 33~64 8个字节 -
SET类型在存储数据时成员个数越多,其占用的存储空间越大。
-
SET类型在选取成员时,与ENUM类型不同,其可以一次选择多个成员。
BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是,它们所表示的是二进制数据。
类型 | 特点 | 长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|---|
BINARY(M) | 固定长度 | M | 0<=M<=255 | M个字节 |
VARBINARY(M) | 可变长度 | M | 0<=M<=65535 | (M+ 1) 个字节 |
BLOB类型
BLOB类型用于保存数据量比较大的二进制数据,如图片,PDF文档等。
数据类型 | 存储范围 | 占用空间 |
---|---|---|
TINYBLOB | 0~2^8 -1字节 | len+1个字节 |
BLOB | 0~2^16 -1字节(相当于64KB) | len+2个字节 |
MEDIUMBLOB | 0~2^24 -1字节(相当于16MB) | len+3个字节 |
LONGBLOB | 0~2^32 -1字节(相当于4GB) | len+4个字节 |
JSON数据类型
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 ,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。
在MySQL 5.7中,就已经支持JSON数据类型。在MySQL中,JSON类型常见的表示方式有2种,分别为JSON数组和JSON对象。
#JSON数组
['abc',10,null,true]
#JSON对象
{"k1":"value","k2":10}
7、特殊的NULL类型
-
所有的类型的值都可以是null,包括int、float等数据类型
-
空字符串"",不等于null,0也不等于null,false也不等于null
-
任何运算符,判断符碰到NULL,都得NULL
-
NULL的判断只能用is null,is not null
-
NULL 影响查询速度,一般避免使值为NULL
七、数据库操作命令
客户端 → 连接器 → [查询缓存] → 解析器 → 预处理器 → 优化器 → 执行引擎 → 存储引擎 → 返回结果
库操作命令
- 查看数据库
cs
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| db2 |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.01 sec)
- 查看所在数据库
cs
select database();
mysql> select database();
+------------+
| database() |
+------------+
| db2 |
+------------+
1 row in set (0.00 sec)
- 查看当前登录用户
cs
select user();
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
- 查看所有用户和主机名
cs
mysql> select user,host from mysql.user;
+------------------+----------------+
| user | host |
+------------------+----------------+
| zhangsan | 192.168.80.150 |
| lisi | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+----------------+
6 rows in set (0.00 sec)
- 查看当前数据库版本
cs
select version();
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.41 |
+-----------+
1 row in set (0.00 sec)
- 查看用户权限列表
cs
show privileges [\G];
\G表示查看所有权限
- 查看指定用户的权限
cs
show grants for root@localhost\G;
- 切换数据库
cs
use databaseName[;]
mysql> use db1
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
- 创建数据库
cs
create database databaseName [character set utf8];
mysql> create database db2;
Query OK, 1 row affected (0.00 sec)
- 删除数据库
cs
drop database databaseName;
mysql>
mysql> drop database db1;
Query OK, 0 rows affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db2 |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
表结构操作命令
- 查看数据表,当前库下没有表时会提示错误(1046)
cs
show tables;
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| t2 |
+---------------+
1 row in set (0.00 sec)
- 查看表结构
cs
desc(describe) tableName;
mysql> desc t2;
[root@mysqld ~]# mysql -e "desc mysql.user"
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(255) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int unsigned | NO | | 0 | |
| max_updates | int unsigned | NO | | 0 | |
| max_connections | int unsigned | NO | | 0 | |
| max_user_connections | int unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
| Create_role_priv | enum('N','Y') | NO | | N | |
| Drop_role_priv | enum('N','Y') | NO | | N | |
| Password_reuse_history | smallint unsigned | YES | | NULL | |
| Password_reuse_time | smallint unsigned | YES | | NULL | |
| Password_require_current | enum('N','Y') | YES | | NULL | |
| User_attributes | json | YES | | NULL | |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
- 创建数据表
cs
create table tableName(columnName(列名称) dataType(数据类型), ............);
mysql> create table t1(id int,name varchar(50), sex varchar(50), phone int);
Query OK, 0 rows affected (0.03 sec)
varchar 定义字符串长度
int 定义整数类型
mysql> select * from t1; #只能看到数据,不能看到表结构
Empty set (0.02 sec)
mysql> describe t1; #查看表结构
- 删除数据表
cs
drop table tableName;
alter命令用法
语法
cs
ALTER TABLE <表名> [修改选项]
常见用法
cs
#增加列,默认在表的最后一列
alter table 表名 ADD column 列名 数据类型;
#修改列名和列类型
alter table 表名 change column 旧列名 新列名 新数据类型;
#修改列的默认值:为某一列设置默认值,或者删除该列的默认值
alter table 表名 alter column 列名 set DEFAULT 默认值;
alter table 表名 alter column 列名 drop default;#如果在插入数据时没有指定 列 的值,MySQL 会将其设置为 null(前提是该列允许 null 值)
#修改列的数据类型:修改表的某一列的数据类型(但不修改列名)
alter table 表名 modify column 列名 新数据类型 [约束条件];
#删除列:从表中删除某一列
alter table 表名 drop column 列名;
#重命名表:将表的名字修改为新的名称
rename table 旧表名 to 新表名;
#修改表的字符集:为表设置新的字符集
alter table 表名 character set 字符集名;
#修改表的校对规则:为表设置新的校对规则(Collation),用于控制字符串比较和排序的方式
COLLATE <校对规则名> >
案例
- 创建测试表
cs
create table stu_score(id tinyint, name varchar(50), score decimal(4,2), object varchar(50));
- 修改表名 rename table 旧表名 to 新表名;
cs
mysql> alter table table3 rename to t3;
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| t2 |
| table3 |
+---------------+
2 rows in set (0.00 sec)
- 修改字段类型(修改字段相对位置) :alter table 表名 modify column 列名 新数据类型 ;
cs
mysql> alter table t3 modify column id int;
mysql> alter table t3 modify id tinyint;
- 修改字段默认值/是否为空/自动增长
cs
#alter table tab_name modify field type not null/default ="未知"/auto_increment;
#自动增长
alter table t3 modify id int primary key;#将 id 列设置为主键
alter table t3 modify id int auto_increment;#表示将 id 列设置为自动递增属性
- 修改字段名/字段类型:alter table 表名 change column 旧列名 新列名 新数据类型;
cs
#alter table tab_name change field newfield newtype;
#修改字段类型
alter table t3 modify id int;
#修改字段名及类型
alter table t3 change column object subject varchar(50);
#通过alter modify 修改字段是否为null或者默认值!
alter table t3 modify column name varchar(50) not null default "未知";
- 添加字段:alter table 表名 ADD column 列名 数据类型;
cs
#alter table tab_name add field type (first/before/after field1);
alter table t3 add column extra text;
#添加到第一列;first:将新字段插入表的第一列
alter table t3 add i int first;
#添加到某一字段后面,在name字段后面 通过after添加sex varchar
alter table t3 add sex varchar(10) after name;
- 删除字段
cs
#alter table tab_name drop field;
alter table t3 drop id;
表数据操作
插入数据
- 单行插入
cs
mysql> insert t3 value(1,'zhangsan','nan','123456');
- 批量插入
cs
mysql> insert t3 values(3,'lihua','nv',147258),(4,'wangyuan','nv',369258);
#指定列名插入 into可以不写
insert into t3 (name, phone, sex) values('张三', '11011011011', '男'),('王五', '12011011011', '女'),('里斯', '12011011099', '男');
注意:只书写表名称,表示全表插入,即,全字段插入! 插入的数据数量与字段数量一定要相等!
where字句运算符
比较运算符
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符
运算符 | 说明 |
---|---|
AND (&&) | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR (||) | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT (!) | 条件为 TRUE(1),结果为 FALSE(0) |
更新数据
- 全表更新:UPDATE 表名 SET 列名=新值;
cs
mysql> update t3 set sex='nv';
- 条件更新:UPDATE 表名 SET 列名=新值 WHERE 条件;
cs
mysql> update t3 set sex='nan' where name='zhangsan';
update stuS set sex='女' where name='铁蛋' and subject='中国武术';
删除数据
- 全表删除
cs
delete from t3;
- 条件删除
cs
delete from stuS where id=6;
查询数据
select在开头,limit在最后,顺序不能乱,where在分组前使用

生成测试表
cs
#表结构
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar(50) | YES | | NULL | |
| class | int(11) | YES | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
mysql -p123 -e "create database if not exists jx2412; create table if not exists jx2412.sc(name varchar(50),class int,score int)"
for i in `cat 2409.txt` ;do echo "insert into jx2409.sc value('$i',$[$RANDOM % 7 + 1],$[$RANDOM % 100]);" > sc.sql;done
create database jx2409;
use jx2409;
create table sc(name varchar(50), class int, score decimal(5,2));
mysql jx2409 < sc.sql
- 全表查询
cs
select * from tableName;
- 去重查询select distinct 列名1, 列名2, ... from 表名;
cs
#distinct
select distinct class from stu;
+-------+
| class |
+-------+
| 2 |
| 7 |
| 1 |
| 5 |
| 4 |
| 6 |
| 3 |
+-------+
- 统计查询,非空数据:select count(disrinct 列名) from 表名;
cs
#count()
select count(distinct class) from stu;
+-----------------------+
| count(distinct class) |
+-----------------------+
| 7 |
+-----------------------+
- 重新定义查询结果表中的列名称
cs
#as
select count(*) [as] count from stu;
#改变结果表中的字段名称
select name 姓名, class 班级, score 成绩 from sc;
SELECT name AS 姓名, class AS 班级, score AS 成绩 FROM sc;
+-----------+--------+--------+
| 姓名 | 班级 | 成绩 |
+-----------+--------+--------+
| 魏嘉辰 | 2 | 98.00 |
| 陶沛宏 | 7 | 64.00 |
- 聚合函数查询;常用函数包括 SUM、AVG、MAX、MIN
cs
#sum():计算和值
select sum(score) 总成绩 from sc;
+-----------+
| 总成绩 |
+-----------+
| 1422.00 |
+-----------+
cs
#avg():计算平均值
mysqld [jx2409]> select avg(score) 平均成绩 from sc;
+--------------+
| 平均成绩 |
+--------------+
| 50.785714 |
+--------------+
cs
#max():最大值
mysqld [jx2409]> select max(score) 最高成绩 from sc;
+--------------+
| 最高成绩 |
+--------------+
| 99.00 |
cs
#min():最小值
select min(score) 最低成绩 from sc;
+--------------+
| 最低成绩 |
+--------------+
| 0.00 |
+--------------+
- 分组查询;select 列名, 聚合函数(列名) form 表名 group by 列名 ;
cs
#group by
##每个班的总成绩
select class,sum(score) from sc group by class;
+-------+------------+
| class | sum(score) |
+-------+------------+
| 1 | 151.00 |
| 2 | 201.00 |
| 3 | 261.00 |
| 4 | 199.00 |
| 5 | 174.00 |
| 6 | 149.00 |
| 7 | 287.00 |
+-------+------------+
##排除2班的每个班的总成绩
select class,sum(score) from sc where class!=2 group by class;
+-------+------------+
| class | sum(score) |
+-------+------------+
| 1 | 151.00 |
| 3 | 261.00 |
| 4 | 199.00 |
| 5 | 174.00 |
| 6 | 149.00 |
| 7 | 287.00 |
+-------+------------+
cs
#分组后的条件:having
##查询总成绩大于200分的班级
select class,sum(score) from sc where class!=2 group by class having sum(score) > 200.00;
+-------+------------+
| class | sum(score) |
+-------+------------+
| 3 | 261.00 |
| 7 | 287.00 |
+-------+------------+
- 排序查询;select 列名 from 表名 order by 列名 [ASC/DESC]; asc升序,desc降序
cs
#order by
#升序
#select * from stu order by age [asc];
#查询总成绩的升序排列结果
select class,sum(score) from sc group by class order by sum(score);
+-------+------------+
| class | sum(score) |
+-------+------------+
| 6 | 149.00 |
| 1 | 151.00 |
| 5 | 174.00 |
| 4 | 199.00 |
| 2 | 201.00 |
| 3 | 261.00 |
| 7 | 287.00 |
+-------+------------+
cs
#降序
#select * from stu order by age desc;
#查询总成绩的降序排列结果
select class,sum(score) from sc group by class order by sum(score) desc;
+-------+------------+
| class | sum(score) |
+-------+------------+
| 7 | 287.00 |
| 3 | 261.00 |
| 2 | 201.00 |
| 4 | 199.00 |
| 5 | 174.00 |
| 1 | 151.00 |
| 6 | 149.00 |
+-------+------------+
- 分页查询;select 列名 from 表名 limit n;
cs
#limit number
#显示前number行
#select * from stu limit 2;
##查询总成绩第一名
select class,sum(score) from sc group by class order by sum(score) desc limit 1;
+-------+------------+
| class | sum(score) |
+-------+------------+
| 7 | 287.00 |
+-------+------------+
#limit [startNumber,显示的数据行数]
#select * from stu limit 2,1;
#只查看总成绩的第二名
select class,sum(score) from sc group by class order by sum(score) desc limit 1,1;
+-------+------------+
| class | sum(score) |
+-------+------------+
| 3 | 261.00 |
+-------+------------+
- 子查询,在一个完整的查询语句中,嵌套若干小查询
cs
#select name,score from stu where name in (select name from info);
#查询在 class2 表中存在的学生姓名和成绩
select name,score from sc where name in (select name from class2);
+-----------+-------+
| name | score |
+-----------+-------+
| 魏嘉辰 | 98.00 |
| 丁睿 | 89.00 |
| 张毅 | 14.00 |
+-----------+-------+
- union联合查询,临时添加内容
cs
####字段个数必须相同
mysql> select * from sc union select 1,2,3;#可做SQL注入
+-----------+-------+-------+
| name | class | score |
+-----------+-------+-------+
| 俞亮 | 1 | 70.00 |
| 刘博实 | 4 | 54.00 |
| 刘振尧 | 6 | 73.00 |
| 张霖杰 | 6 | 16.00 |
| 陈金招 | 5 | 31.00 |
| 武光斌 | 3 | 99.00 |
| 张浩 | 1 | 70.00 |
| 李松旺 | 3 | 43.00 |
| 潘圳航 | 5 | 28.00 |
| 米博宇 | 7 | 88.00 |
| 李振辉 | 4 | 0.00 |
| 王晨宇 | 5 | 57.00 |
| 谢辉 | 2 | 84.00 |
| 1 | 2 | 3.00 |
+-----------+-------+-------+
14 rows in set (0.01 sec)
cs
###
mysql> select * from sc union select '铁锤',2,45;
+-----------+-------+-------+
| name | class | score |
+-----------+-------+-------+
| 俞亮 | 1 | 70.00 |
| 刘博实 | 4 | 54.00 |
| 刘振尧 | 6 | 73.00 |
| 张霖杰 | 6 | 16.00 |
| 陈金招 | 5 | 31.00 |
| 武光斌 | 3 | 99.00 |
| 张浩 | 1 | 70.00 |
| 李松旺 | 3 | 43.00 |
| 潘圳航 | 5 | 28.00 |
| 米博宇 | 7 | 88.00 |
| 李振辉 | 4 | 0.00 |
| 王晨宇 | 5 | 57.00 |
| 谢辉 | 2 | 84.00 |
| 铁锤 | 2 | 45.00 |
+-----------+-------+-------+
14 rows in set (0.00 sec)
###
select * from sc union (select 1,name,3 from info limit 1);
- 多表查询
内连接查询
隐式内连接:
cs
#select A.name as name, A.school, B.job from B,A where A.name=B.name;
#select A.name as name, A.school, B.job from B [inner] join A on A.name=B.name;
select class2.id, class2.name, sc.class, sc.score from sc join class2 on sc.name=class2.name;
+------+-----------+-------+-------+
| id | name | class | score |
+------+-----------+-------+-------+
| 1 | 魏嘉辰 | 2 | 98.00 |
| 2 | 丁睿 | 2 | 89.00 |
| 3 | 张毅 | 2 | 14.00 |
+------+-----------+-------+-------+
外连接查询
-
左外连接 left [ outer] join
select 列 from 表A left [outer] join 表B 条件;
cs
#select A.name as nameA, A.school, B.name as nameB, B.job from B left join A on A.name=B.name;
select class2.id, class2.name, sc.class, sc.score from sc left join class2 on sc.name=class2.name;
+------+-----------+-------+-------+
| id | name | class | score |
+------+-----------+-------+-------+
| 1 | 魏嘉辰 | 2 | 98.00 |
| 2 | 丁睿 | 2 | 89.00 |
| 3 | 张毅 | 2 | 14.00 |
| NULL | NULL | 7 | 64.00 |
| NULL | NULL | 1 | 52.00 |
| NULL | NULL | 7 | 99.00 |
| NULL | NULL | 7 | 28.00 |
| NULL | NULL | 5 | 91.00 |
| NULL | NULL | 1 | 38.00 |
| NULL | NULL | 4 | 29.00 |
| NULL | NULL | 6 | 1.00 |
| NULL | NULL | 3 | 74.00 |
| NULL | NULL | 6 | 0.00 |
| NULL | NULL | 3 | 25.00 |
| NULL | NULL | 6 | 84.00 |
| NULL | NULL | 1 | 1.00 |
| NULL | NULL | 1 | 53.00 |
| NULL | NULL | 4 | 84.00 |
| NULL | NULL | 3 | 79.00 |
| NULL | NULL | 3 | 30.00 |
| NULL | NULL | 7 | 96.00 |
| NULL | NULL | 6 | 64.00 |
| NULL | NULL | 3 | 12.00 |
| NULL | NULL | 5 | 78.00 |
| NULL | NULL | 1 | 7.00 |
| NULL | NULL | 5 | 5.00 |
| NULL | NULL | 4 | 86.00 |
| NULL | NULL | 3 | 41.00 |
+------+-----------+-------+-------+
- 右外连接 select 列 from 表A right [outer] join 表B 条件;
cs
#select A.name as nameA, A.school, B.name as nameB, B.job from B right join A on A.name=B.name;
select class2.id, class2.name, sc.class, sc.score from sc right join class2 on sc.name=class2.name;
+------+-----------+-------+-------+
| id | name | class | score |
+------+-----------+-------+-------+
| 1 | 魏嘉辰 | 2 | 98.00 |
| 2 | 丁睿 | 2 | 89.00 |
| 3 | 张毅 | 2 | 14.00 |
| 4 | Rose | NULL | NULL |
+------+-----------+-------+-------+
案例练习
1.1、统计每个学院老师数量

1.2、统计每个学院专业数量


1.3、统计计算机学院男生数量

1.4、统计每个学院年级数量

1.5、统计每个学院班级数量

2.1、2021级计算机科学与技术成绩最高分姓名成绩

2.2、2021级计算机科学与技术各个班的平均分

2.3、2023级会计学每个班总平均分

2.4、机械工程学院2023级总分第一名

八、mysqld用户权限管理
MySQL数据库权限分类
MySQL 权限对照表
权限 (Privilege) | 上下文 (Context) | 注释 (Comment) |
---|---|---|
Alter | 表 (Tables) | 修改表结构 |
Alter routine | 函数、存储过程 (Functions, Procedures) | 修改或删除存储函数/存储过程 |
Create | 数据库、表、索引 (Databases, Tables, Indexes) | 创建新数据库、表和索引 |
Create routine | 数据库 (Databases) | 使用 CREATE FUNCTION/PROCEDURE 创建存储过程和函数 |
Create temporary tables | 数据库 (Databases) | 创建临时表 |
Create view | 表 (Tables) | 创建视图 |
Create user | 服务器管理 (Server Admin) | 创建新用户 |
Delete | 表 (Tables) | 删除表中现有数据 |
Drop | 数据库、表、视图 (Databases, Tables, Views) | 删除数据库、表和视图 |
Event | 服务器管理 (Server Admin) | 创建、修改、删除和执行事件 |
Execute | 函数、存储过程 (Functions, Procedures) | 执行存储过程和函数 |
File | 文件访问 (File access on server) | 读写服务器文件系统 |
Grant option | 数据库、表、函数、存储过程 (Databases, Tables, Functions, Procedures) | 授予其他用户你拥有的权限 |
Index | 表 (Tables) | 创建或删除索引 |
Insert | 表 (Tables) | 向表中插入数据 |
Lock tables | 数据库 (Databases) | 使用 LOCK TABLES 锁定表(需与 SELECT 权限配合) |
Process | 服务器管理 (Server Admin) | 查看当前正在执行的查询的明文 |
Proxy | 服务器管理 (Server Admin) | 允许代理用户身份 |
References | 数据库、表 (Databases, Tables) | 在表之间创建外键约束 |
Reload | 服务器管理 (Server Admin) | 重新加载权限、刷新日志等 |
Replication client | 服务器管理 (Server Admin) | 查看从库(Slave)或主库(Master)的位置 |
Replication slave | 服务器管理 (Server Admin) | 从主库读取二进制日志事件 |
Select | 表 (Tables) | 查询表中数据 |
Show databases | 服务器管理 (Server Admin) | 使用 SHOW DATABASES 查看所有数据库 |
Show view | 表 (Tables) | 使用 SHOW CREATE VIE 查看视图定义 |
Shutdown | 服务器管理 (Server Admin) | 关闭 MySQL 服务器 |
Super | 服务器管理 (Server Admin) | 执行高级操作(如 KILL 线程、设置全局变量、变更主从复制配置等) |
Trigger | 表 (Tables) | 创建和使用触发器 |
Create tablespace | 服务器管理 (Server Admin) | 创建/修改/删除表空间 |
Update | 表 (Tables) | 更新表中现有数据 |
Usage | 服务器管理 (Server Admin) | 无权限(仅允许连接数据库) |
关键权限分类
-
表级权限(如 Alter、Insert):直接操作表结构和数据
-
数据库级权限(如 Create、Drop):管理数据库整体
-
服务器管理权限(如 Shutdown、Super):高风险操作,需严格限制
-
高级功能权限(如 Replication、Trigger):涉及数据同步和自动化逻辑
中文释义
cs
在MySQL中,权限控制是通过Grant和Revoke命令来管理用户和角色的权限的。
- Alter:修改。允许用户修改数据库中的表结构。
- Alter routine:修改存储过程或函数。允许用户修改已创建的存储过程或函数。
- Create:创建。允许用户创建新的数据库对象,如表、视图、存储过程等。
- Create routine:创建存储过程或函数。允许用户创建新的存储过程或函数。
- Create temporary tables:创建临时表。允许用户创建临时表,这些表在会话结束时会自动删除。
- Create view:创建视图。允许用户创建新的视图。
- Create user:创建用户。允许用户创建新的数据库用户账户。
- Delete:删除。允许用户删除表中的数据。
- Drop:删除。允许用户删除数据库中的对象,如表、视图等。
- Event:事件。允许用户管理和修改事件调度器中的事件。
- Execute:执行。允许用户执行存储过程或函数。
- File:文件。允许用户访问数据库服务器的文件系统。
- Grant option:授予选项。允许用户将权限授予其他用户。
- Index:索引。允许用户在表上创建、修改或删除索引。
- Insert:插入。允许用户向表中插入数据。
- Lock tables:锁定表。允许用户锁定数据库中的表,以防止其他用户同时访问这些表。
- Process:进程。允许查看或杀死数据库服务器上的进程。
- Proxy:代理。允许用户作为代理登录,代表其他用户执行操作。
- References:引用。允许用户创建外键约束。
- Reload:重新加载。允许用户重新加载配置文件或刷新权限表。
- Replication client:复制客户端。允许用户从主服务器接收数据以进行复制。
- Replication slave:复制从机。允许用户作为数据复制的从服务器。
- Select:选择。允许用户查询表中的数据。
- Show databases:显示数据库。允许用户查看用的数据库列表。
- Show view:显示视图。允许用户查看数据库中的视图定义。
- Shutdown:关闭。允许用户关闭数据库服务器。
- Super:超级。允许用户所有的权限,并且可以不受限制地执行许多系统命令。
- Trigger:触发器。允许用户创建触发器,以在特定事件发生时自动执行代码。
- Create tablespace:创建表空间。允许用户创建新的表空间,用于存储数据库对象。
- Update:更新。允许用户更新表中的数据。
- Usage:使用。这个权限通常用于限制用户只能查看自己的权限,不能进行任何实际的数据库操作。
user_name | host_name | 说明 |
---|---|---|
zhx | 198.51.100.166 | zhx,只能从此ip连接 |
zhx | 198.51.100.% | zhx,从192.168.115子网中的任何主机 |
zhx | % | zhx,任何主机可连 |
创建远程管理用户
cs
create user webuser@'192.168.115.%' identified by '123.com'; -- 只创建的用户默认具有USAGE权限!
-- 更改密码
alter user jx@192.168.166.9 identified by '123';
-- 在mysql8之前的数据库,grant命令运行的时候,发现用户不存在,则隐式创建!
-- 查看权限
show grants for root@localhost\G;
-- 赋权 all表示所有权限 ; *.*代表所有库的所有表
grant all on *.* to 'root'@'192.168.115.130';
-- 刷新权限
flush privileges;
创建远程web服务数据库的操作用户
cs
-- 对jx库所有具有管理权
grant all on jx.* to 'zhangsan'@'192.168.80.%' identified by '123.com';
flush privileges;
-- 张三用户对表jx.info 有查询权限
grant select on jx.info to 'zhangsan'@'192.168.80.%';
查看用户权限
cs
show grants for 'testuser'@'192.168.115.%';
mysqld [mysql]> show grants for webuser@'192.168.115.%';
+--------------------------------------------------------------------------------------------------------------------+
| Grants for webuser@192.168.115.% |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'webuser'@'192.168.115.%' IDENTIFIED BY PASSWORD '*AC241830FFDDC8943AB31CBD47D758E79F7953EA' |
+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
删除用户权限
cs
revoke all on 库.表 from 'username'@'ipaddress';
flush privileges;
案例
cs
-- 删除用户的连接权限
revoke usage on *.* from 'username'@'ipaddress';
-- 无法直接删除,只能删除账户
cs
#本地登录
mysql> create user 'zhangsan'@'localhost'
#来自某个主机登录
mysql> create user 'zhangsan'@'192.168.80.150' identified by '123.com';
Query OK, 0 rows affected (0.02 sec)
#identified by
mysql> show grants for zhangsan@192.168.80.150;#指定zhangsan用户登录
+---------------------------------------------------+
| Grants for zhangsan@192.168.80.150 |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `zhangsan`@`192.168.80.150` |
+---------------------------------------------------+
1 row in set (0.00 sec)
#USAGE 允许登陆的权限
cs
#更改张三的密码
mysql> alter user zhangsan@192.168.80.150 identified by '123';
Query OK, 0 rows affected (0.02 sec)
#使用远程登录张三用户,啥也干不了
[root@localhost ~]# mysql -h192.168.80.129 -uzhangsan -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.01 sec)
mysql> create databass db1; #创建的db1库失败
ERROR 1044 (42000): Access denied for user 'zhangsan'@'192.168.80.150' to database 'db1'
九、mysqld数据库备份
9.1 数据备份的重要性
-
备份的主要目的是灾难恢复。
-
在生产环境中,数据的安全性至关重要。
-
任何数据的丢失都可能产生严重的后果。
9.2 造成数据丢失的原因
-
程序错误
-
人为操作错误
-
运算错误
-
磁盘故障
-
灾难(如火灾、地震)和盗窃
9.2 备份需要考虑的问题
-
可以容忍丢失多长时间的数据;
-
恢复数据要在多长时间内完成;
-
恢复的时候是否需要持续提供服务;
-
恢复的对象,是整个库,多个表,还是单个库,单个表。
9.4 备份类型
1、根据是否需要数据库离线
-
冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;
-
温备(warm backup):服务在线,但仅支持读(select)请求,不允许写请求;
-
热备(hot backup):备份的同时,业务不受影响。
注意:
这种类型的备份,取决于业务的需求,而不是备份工具
MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具
1.1、常用备份工具
商业工具
-
Navicat for MySQL
-
功能特点:它提供了直观的图形化界面,方便用户轻松地创建备份任务、设置备份计划以及恢复数据。支持多种备份类型,如完整备份、增量备份等,还能对备份文件进行加密和压缩,以确保数据的安全性和减小备份文件的大小。
-
适用场景:适用于各种规模的企业和开发团队,尤其是那些需要频繁进行数据库备份和恢复操作,且对操作的便捷性和可视化有较高要求的用户。
-
-
SQLyog Ultimate
-
功能特点:具有强大的备份和恢复功能,支持定时备份,可以按照设定的时间周期自动执行备份任务。同时,它还提供了数据同步功能,能够在不同的 MySQL 数据库之间进行数据同步,方便数据迁移和数据一致性维护。
-
适用场景:受 MySQL 开发者和数据库管理员的欢迎,常用于开发环境和生产环境中的数据库管理与备份工作,对于需要进行数据库版本控制和数据迁移的场景也非常实用。
-
开源工具
-
Percona XtraBackup
-
功能特点 :它是一款开源的热备份工具,能够在不停止 MySQL 服务的情况下进行备份,支持对 InnoDB 和 XtraDB 存储引擎的备份和恢复,备份过程中不会阻塞数据库的正常读写操作,从而保证了业务的连续性。此外,它还提供了增量备份和部分备份功能,可有效减少备份时间和备份文件的大小。
-
适用场景:因其高效、灵活的特点,广泛应用于各种对业务连续性要求较高的生产环境,特别适合大型数据库和高并发应用场景下的备份需求 。
-
-
MyDumper
-
功能特点:是一款多线程的备份和恢复工具,能够充分利用系统资源,大大提高备份和恢复的速度。它支持将数据库备份为多个文件,便于在恢复时进行灵活的选择和操作,同时还可以对备份文件进行压缩,节省存储空间。
-
适用场景:适用于需要快速备份和恢复大型 MySQL 数据库的场景,如互联网公司的大规模数据存储和处理环境,以及对备份效率有较高要求的企业级应用。
-
2、根据要备份的数据集合的范围
-
**完全备份:**full backup,备份全部字符集(全部数据库),每次备份都会进行完全备份,会导致备份文件占用大量的磁盘空间,并且有大量的重复数据,只适合第一次备份,不常用。
-
差异备份: incremental backup,要先进行一次完全备份,每次差异备份都会备份上一次完全备份后的数据,可能会出现备份的重复数据,导致占用大量的磁盘空间;
-
**增量备份:**differential backup,要先执行一次完全备份,每一次增量备份的数据都是备份在上一次完全备份或者上一次增量备份后的数据,不会出现重复数据,也不会占用额外的磁盘空间
建议的恢复策略
-
完全+增量+二进制日志
-
完全+差异+二进制日志
3、根据备份数据或文件
物理备份:直接备份数据文件
-
优点:备份和恢复操作都比较简单,能够支持兼容的mysql版本;恢复速度快,属于文件系统级别的。
-
建议:不要假设备份一定可用,要测试 mysql>check tables;检测表是否可用。
逻辑备份: 备份表中的数据和代码
-
优点:恢复简单;备份的结果为ASCII文件,可以编辑;与存储引擎无关;可以通过网络备份和恢复;
-
缺点:备份或恢复都需要mysql服务器进程参与;备份结果占据更多的空间;浮点数可能会丢失精度;还原之后,缩影需要重建
9.5 常见的备份方法
1、物理冷备(完全备份)
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的
2、专用备份工具mysqldump或mysqlhotcopy (完全备份,逻辑备份)
mysqldump常用的逻辑备份工具 (导出为sql脚本)
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
启用二进制日志进行增量备份 (增量备份)
进行增量备份,需要刷新二进制日志
3、第三方工具备份
免费的MySQL热备份软件Percona XtraBackup(阿里云的工具:dts,支持热迁移)
9.6 备份案例
mysqldump工具
1、完整备份
所有数据库的备份
备份
cs
mysqldump --all-databases -uroot > all.sql
#mysql 设置密码 必须-p 输入密码才能备份
[root@houfan ~]# mysqldump --all-databases -uroot -p > all.sql
恢复
cs
mysql -uroot < all.sql
指定数据库的备份
备份
cs
mysqldump --databases jx -uroot > jx.sql
[root@houfan ~]# mysqldump --databases db2 -uroot -p > db2.sql
恢复
cs
mysql -uroot < jx.sql
指定数据表的备份
备份
cs
mysqldump jx stu > jx.stu.sql
[root@houfan ~]# mysqldump db2 t2 -uroot -p > db2.t2.sql
[root@houfan ~]# mysql -uroot -p -e 'create database db3';
#备份的表可以在其他库数据可恢复备份
[root@houfan ~]# mysql -uroot -p db3 < db2.t2.sql
Enter password:
[root@houfan ~]# mysql -uroot -p -e 'use db3;show tables'
Enter password:
+---------------+
| Tables_in_db3 |
+---------------+
| t2 |
+---------------+
恢复
cs
mysql -uroot jx< jx.sql
2、增量备份
二进制备份
注意:在做二进制备份的时候现做一个完备,再进行二进制备份
配置过程
cs
[root@houfan my.cnf.d]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
log-bin=mysql-bin
binlog_format="statement"
~
#重启MySQL 会出现 mysql-bin 文件
[root@houfan mysql]# systemctl restart mysqld
[root@houfan mysql]# ls
#刷新日志文件
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
查看日志文件内容
cs
##在数据库中查看日志文件及书写位置
show master status;
######
mysqlbinlog mysql-bin.000001 |less
二进制备份的恢复
模拟数据丢失流程
cs
flush logs; ###刷新日志文件,产生新的日志文件
-- 创建数据表及插入数据
mysql> insert t2 value(5,'lisi','nan','123456','dd');
Query OK, 1 row affected (0.00 sec)
flush logs;
-- 执行删除操作
mysql> delete from t2 where id=5;
Query OK, 1 row affected (0.00 sec)
#查看二进制日志文件
# at 916
#250705 22:48:57 server id 1 end_log_pos 1036 CRC32 0x2b6ed943 Querythread_id=9 exec_time=0 error_code=0
SET TIMESTAMP=1751770137/*!*/;
insert t2 value(5,'lisi','nan','123456','dd')
/*!*/;
# at 1036
数据恢复
基于位置
cs
#基于开始位置
mysqlbinlog --start-position="245" mysql-bin.000003 | mysql -uroot
#基于结束位置
mysqlbinlog --stop-position="632" mysql-bin.000003 | mysql -uroot
#基于中间位置
mysqlbinlog --start-position="245" --stop-position="632" mysql-bin.000003 | mysql -uroot
模拟操作
1、查看指定位置二进制文件内容
cs
[root@houfan mysql]# mysqlbinlog --start-position=916 --stop-position=1067 mysql-bin.000002
# at 916
#250705 22:48:57 server id 1 end_log_pos 1036 CRC32 0x2b6ed943 Querythread_id=9 exec_time=0 error_code=0
use `db3`/*!*/;
SET TIMESTAMP=1751770137/*!*/;
SET @@session.pseudo_thread_id=9/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
insert t2 value(5,'lisi','nan','123456','dd')
/*!*/;
# at 1036
2、对指定区域内的数据进行恢复
cs
[root@houfan mysql]# mysqlbinlog --start-position=916 --stop-position=1067 mysql-bin.000002 | mysql -uroot -p
Enter password:
#查看数据是否更新
mysql> select * from t2;
+------+----------+------+--------+-------+
| id | name | sex | phone | exter |
+------+----------+------+--------+-------+
| 1 | llll | 男 | NULL | NULL |
| 3 | wangyuan | 女 | NULL | NULL |
| 4 | zhangsan | 男 | NULL | NULL |
| 5 | lisi | nan | 123456 | dd |
+------+----------+------+--------+-------+
4 rows in set (0.00 sec)
基于时间
cs
#基于开始时间
mysqlbinlog --start-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot
#基于结束时间
mysqlbinlog --stop-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot
#基于中间时间
mysqlbinlog --start-datetime="2022-12-23 16:17:59" --stop-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot
XtraBackup 8.0.35-33 使用指南
简介
XtraBackup 8.0.35-33 是 Percona 提供的一个开源热备份工具,用于 MySQL 8.0 数据库的物理备份和恢复。它是 MySQL 企业级备份解决方案的重要组成部分。
安装
在基于 RPM 的系统上安装
cs
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release enable-only tools release
sudo yum install percona-xtrabackup-80
在基于 Debian 的系统上安装
cs
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo percona-release enable-only tools release
sudo apt-get update
sudo apt-get install percona-xtrabackup-80
基本使用
1. 完整备份
cs
xtrabackup --backup --target-dir=/path/to/backup --user=username --password=password
2. 准备备份(应用日志)
cs
xtrabackup --prepare --target-dir=/path/to/backup
3. 恢复备份
cs
xtrabackup --copy-back --target-dir=/path/to/backup
高级使用案例
案例1:增量备份
- 首先进行完整备份:
cs
xtrabackup --backup --target-dir=/backups/full --user=root --password=yourpassword
- 进行第一次增量备份:
cs
xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/full --user=root --password=yourpassword
- 进行第二次增量备份:
cs
xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1 --user=root --password=yourpassword
- 准备完整备份:
cs
xtrabackup --prepare --apply-log-only --target-dir=/backups/full
- 应用第一个增量备份:
cs
xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc1
- 应用第二个增量备份:
cs
xtrabackup --prepare --target-dir=/backups/full --incremental-dir=/backups/inc2
案例2:压缩备份
cs
xtrabackup --backup --compress --target-dir=/backups/compressed --user=root --password=yourpassword
解压并准备备份:
cs
xtrabackup --decompress --target-dir=/backups/compressed
xtrabackup --prepare --target-dir=/backups/compressed
案例3:并行备份和恢复
cs
xtrabackup --backup --parallel=4 --target-dir=/backups/parallel --user=root --password=yourpassword
并行压缩:
cs
xtrabackup --backup --compress --compress-threads=4 --parallel=4 --target-dir=/backups/parallel_compressed --user=root --password=yourpassword
案例4:加密备份
- 生成加密密钥:
cs
openssl rand -base64 24 > /backups/encryption_key
- 创建加密备份:
cs
xtrabackup --backup --target-dir=/backups/encrypted --encrypt=AES256 --encrypt-key-file=/backups/encryption_key --user=root --password=yourpassword
- 解密备份:
cs
xtrabackup --decrypt=AES256 --encrypt-key-file=/backups/encryption_key --target-dir=/backups/encrypted
案例5:流式备份
备份到单个压缩文件:
cs
xtrabackup --backup --stream=xbstream --user=root --password=yourpassword | gzip > /backups/backup.xbstream.gz
从流式备份恢复:
cs
gunzip -c /backups/backup.xbstream.gz | xbstream -x -C /var/lib/mysql
xtrabackup --prepare --target-dir=/var/lib/mysql
常用选项说明
选项 | 描述 |
---|---|
--backup |
执行备份操作 |
--prepare |
准备备份以进行恢复 |
--copy-back |
将备份复制回原始位置 |
--target-dir |
指定备份目标目录 |
--user |
MySQL 用户名 |
--password |
MySQL 密码 |
--host |
MySQL 主机地址 |
--port |
MySQL 端口 |
--parallel |
并行线程数 |
--compress |
启用压缩 |
--compress-threads |
压缩线程数 |
--encrypt |
加密算法 |
--encrypt-key-file |
加密密钥文件 |
--incremental-basedir |
增量备份的基础目录 |
--incremental-dir |
增量备份目录 |
--stream |
流式备份格式 (xbstream) |
注意事项
-
确保有足够的磁盘空间存放备份文件
-
备份期间数据库负载可能会增加
-
恢复前确保 MySQL 服务已停止
-
恢复后可能需要调整文件权限
-
定期测试备份的可用性
最佳实践
-
定期进行完整备份和增量备份
-
备份文件存储在不同于数据库服务器的位置
-
实施备份验证流程
-
记录备份和恢复过程
-
监控备份作业的状态和持续时间
通过以上指南,您可以充分利用 XtraBackup 8.0.35-33 的强大功能来保护您的 MySQL 数据。
MyDumper 详细使用指南
MyDumper 是一个高性能的 MySQL 逻辑备份工具,相比传统的 mysqldump 具有并行备份、快照一致性等优势。以下是 MyDumper 的详细使用方式和案例。
安装 MyDumper
Ubuntu/Debian 系统
cs
sudo apt-get install mydumper
CentOS/RHEL 系统
cs
sudo yum install mydumper
从源码编译
cs
git clone https://github.com/mydumper/mydumper.git
cd mydumper
mkdir build
cd build
cmake ..
make
make install
基本使用
1. 完整备份数据库
cs
mydumper -u [username] -p [password] -h [host] -P [port] -o /backup/directory
2. 恢复数据库
cs
myloader -u [username] -p [password] -h [host] -P [port] -d /backup/directory
常用参数说明
参数 | 描述 | 示例 |
---|---|---|
-u |
用户名 | -u root |
-p |
密码 | -p secret |
-h |
主机地址 | -h 127.0.0.1 |
-P |
端口号 | -P 3306 |
-o |
输出目录 | -o /backups |
-d |
恢复时指定备份目录 | -d /backups |
-B |
指定备份的数据库 | -B db1,db2 |
-T |
指定备份的表 | -T db1.table1 |
-t |
线程数 | -t 8 |
-c |
压缩输出 | -c |
-v |
详细输出 | -v 3 |
-C |
压缩备份文件 | -C |
-e |
备份表结构 | -e |
-r |
分割表的行数 | -r 100000 |
-F |
按大小分割备份文件(MB) | -F 256 |
-s |
一致性快照 | -s |
使用案例
案例1:备份单个数据库
cs
mydumper -u root -p password -h localhost -B mydatabase -o /backups/mydatabase
案例2:备份多个特定表
cs
mydumper -u root -p password -h localhost -T db1.table1,db1.table2 -o /backups/tables
案例3:多线程备份(8个线程)
cs
mydumper -u root -p password -h localhost -t 8 -o /backups/full
案例4:压缩备份
cs
mydumper -u root -p password -h localhost -c -o /backups/compressed
案例5:按100万行分割表数据
cs
mydumper -u root -p password -h localhost -r 1000000 -o /backups/split
案例6:备份数据库结构(不备份数据)
cs
mydumper -u root -p password -h localhost -e -o /backups/schema
案例7:恢复数据库到不同名称
cs
myloader -u root -p password -h localhost -d /backups/full -B new_db_name
案例8:只恢复特定表
cs
myloader -u root -p password -h localhost -d /backups/full -T db1.table1
高级功能
1. 一致性快照备份
cs
mydumper -u root -p password -h localhost -s -o /backups/snapshot
2. 正则表达式过滤表
cs
mydumper -u root -p password -h localhost -x '^sakila\.(actor|film)' -o /backups/regex
3. 备份时排除某些表
cs
mydumper -u root -p password -h localhost -B sakila -X '^sakila\.film_text' -o /backups/exclude
4. 长查询超时设置
cs
mydumper -u root -p password -h localhost --long-query-retries=10 --long-query-retry-interval=30 -o /backups/timeout
5. 只备份数据不备份结构
cs
mydumper -u root -p password -h localhost --no-schemas -o /backups/data_only
实际应用场景
场景1:生产环境每日备份
cs
# 备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backups/mysql/$DATE"
LOG_FILE="/var/log/mydumper_${DATE}.log"
mydumper -u backup_user -p backup_pass -h 10.0.0.1 -P 3306 -t 4 -c -v 3 -o $BACKUP_DIR > $LOG_FILE 2>&1
# 保留7天备份
find /backups/mysql/ -type d -mtime +7 -exec rm -rf {} \;
场景2:大数据表部分恢复
cs
# 只恢复用户表的前100万条数据
myloader -u root -p password -h localhost -d /backups/full -T db.users --rows=1000000
场景3:跨服务器迁移数据库
cs
# 源服务器
mydumper -u root -p password -h source_host -B db_to_migrate -c -o /tmp/db_backup
# 目标服务器
myloader -u root -p password -h target_host -d /tmp/db_backup
注意事项
-
确保备份用户有足够的权限(至少需要 SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT 权限)
-
大数据库备份时考虑磁盘空间
-
备份期间可能会对生产数据库性能产生影响
-
恢复前最好在测试环境验证备份文件
-
考虑使用--no-locks选项减少锁表时间(但可能影响一致性)
性能优化建议
-
根据服务器CPU核心数设置适当的线程数(-t)
-
对大表使用-r参数分割备份文件
-
使用-c或-C参数压缩备份减少存储空间
-
考虑使用--no-locks选项减少锁表时间(如果允许不一致)
-
对于InnoDB表,使用-s参数获取一致性快照
通过合理配置MyDumper,您可以高效地完成MySQL数据库的备份和恢复工作,满足各种业务场景的需求。
mysqlhotcopy 使用指南
mysqlhotcopy 是 MySQL 提供的一个 Perl 脚本工具,用于快速备份 MyISAM 和 ARCHIVE 表。它通过直接复制数据库文件来实现快速备份,比逻辑备份工具如 mysqldump 更快,但只适用于特定存储引擎。
安装与准备
mysqlhotcopy 通常随 MySQL 客户端一起安装,位于 MySQL 的 bin 目录下。
检查是否安装
cs
which mysqlhotcopy
确保依赖安装(Perl 模块)
cs
sudo apt-get install perl-dbi perl-dbd-mysql # Debian/Ubuntu
sudo yum install perl-DBI perl-DBD-Mysql # CentOS/RHEL
基本语法
cs
mysqlhotcopy [options] db_name [/path/to/backup/directory]
常用选项
选项 | 描述 |
---|---|
--user= |
MySQL 用户名 |
--password= |
MySQL 密码 |
--host= |
MySQL 主机 |
--port= |
MySQL 端口 |
--socket= |
MySQL socket 文件 |
--regexp= |
使用正则表达式匹配数据库 |
--allowold |
不覆盖现有备份,添加 _old 后缀 |
--keepold |
不删除被覆盖的备份 |
--noindices |
不备份索引文件 |
--method= |
复制方法 (cp 或 scp) |
--flushlog |
备份后刷新日志 |
--resetmaster |
备份后重置二进制日志 |
--resetslave |
备份后重置从库信息 |
--addtodest |
添加而不是替换目标目录 |
--dryrun |
模拟执行,不实际复制 |
使用案例
案例1:备份单个数据库
cs
mysqlhotcopy --user=root --password=yourpassword mydatabase /backup/mysql
案例2:备份多个数据库
cs
mysqlhotcopy --user=root --password=yourpassword db1 db2 db3 /backup/mysql
案例3:使用正则表达式备份匹配的数据库
cs
mysqlhotcopy --user=root --password=yourpassword --regexp='^test_' /backup/mysql
案例4:保留旧备份
cs
mysqlhotcopy --user=root --password=yourpassword --allowold --keepold mydatabase /backup/mysql
案例5:远程备份到其他服务器
cs
mysqlhotcopy --user=root --password=yourpassword --method=scp mydatabase user@remotehost:/remote/backup/dir
案例6:不备份索引文件
cs
mysqlhotcopy --user=root --password=yourpassword --noindices mydatabase /backup/mysql
案例7:备份后刷新日志
cs
mysqlhotcopy --user=root --password=yourpassword --flushlog mydatabase /backup/mysql
案例8:模拟运行(不实际备份)
cs
mysqlhotcopy --user=root --password=yourpassword --dryrun mydatabase /backup/mysql
实际应用场景
场景1:生产环境每日备份脚本
cs
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/mysql/$DATE"
LOG_FILE="/var/log/mysqlhotcopy_${DATE}.log"
# 确保备份目录存在
mkdir -p $BACKUP_DIR
# 备份所有数据库
mysqlhotcopy --user=backup_user --password=backup_pass \
--allowold --keepold \
--flushlog \
--regexp='.*' \
$BACKUP_DIR > $LOG_FILE 2>&1
# 删除7天前的备份
find /backup/mysql/ -type d -mtime +7 -exec rm -rf {} \;
场景2:备份特定表
cs
# 备份 mydatabase 中的 table1 和 table2
mysqlhotcopy --user=root --password=yourpassword \
mydatabase.table1 mydatabase.table2 \
/backup/mysql
场景3:增量备份策略
cs
#!/bin/bash
DATE=$(date +%Y%m%d)
FULL_BACKUP_DIR="/backup/mysql/full"
INC_BACKUP_DIR="/backup/mysql/inc_$DATE"
# 每周日做完整备份
if [ $(date +%u) -eq 7 ]; then
mysqlhotcopy --user=backup_user --password=backup_pass \
--allowold --keepold \
--flushlog \
--regexp='.*' \
$FULL_BACKUP_DIR
else
# 其他日子做增量备份
mysqlhotcopy --user=backup_user --password=backup_pass \
--addtodest \
--regexp='.*' \
$INC_BACKUP_DIR
fi
恢复数据库
mysqlhotcopy 的恢复是通过直接复制文件回原始位置实现的:
- 停止 MySQL 服务
cs
systemctl stop mysql
- 复制备份文件到 MySQL 数据目录
cs
cp -R /backup/mysql/mydatabase /var/lib/mysql/
- 确保文件权限正确
cs
chown -R mysql:mysql /var/lib/mysql/mydatabase
- 启动 MySQL 服务
cs
systemctl start mysql
注意事项
-
存储引擎限制:mysqlhotcopy 只适用于 MyISAM 和 ARCHIVE 表,不适用于 InnoDB
-
锁表:mysqlhotcopy 在备份期间会锁定表,可能导致应用程序短暂阻塞
-
备份一致性:对于正在写入的表,备份可能不一致
-
权限要求:
-
执行用户需要有读取数据库文件的权限
-
MySQL 用户需要 SELECT、RELOAD、LOCK TABLES 权限
-
-
备份完整性:备份后建议验证备份文件的完整性
-
版本兼容性:确保备份和恢复使用相同版本的 MySQL
性能优化建议
-
在低峰期执行备份操作
-
对于大型数据库,考虑分批备份
-
使用
--noindices
选项可以加快备份速度(但恢复时需要重建索引) -
考虑使用
--method=scp
直接备份到远程服务器,减少本地磁盘IO -
对于频繁更新的表,考虑结合 FLUSH TABLES 命令确保数据一致性
替代方案
由于 mysqlhotcopy 的局限性,现代 MySQL 环境通常使用以下替代方案:
-
对于 InnoDB 表:使用 Percona XtraBackup
-
逻辑备份:使用 mysqldump 或 mydumper
-
文件系统快照:LVM 快照或存储设备快照功能
mysqlhotcopy 最适合用于 MyISAM 表的快速备份场景,特别是当数据库大小适中且可以接受短暂锁表的情况下。
附录 A mysqld配置文件
cs
# mysqld配置文件
# ----------------- 客户端配置 -----------------
[client]
port = 3306 # 客户端连接数据库的端口,默认为3306
socket = /var/lib/mysql/mysql.sock # 服务器socket文件的路径,默认为/var/lib/mysql/mysql.sock
# ----------------- MySQL客户端工具配置 -----------------
[mysql]
default-character-set=utf8mb4 # 客户端连接数据库时的默认字符集,这里使用utf8mb4
# ----------------- 服务器配置 -----------------
[mysqld]
user = mysql # 运行数据库服务器的系统用户,默认为mysql
port = 3306 # 服务器监听的端口,默认为3306
socket = /var/lib/mysql/mysql.sock # 服务器socket文件的路径,默认为/var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysql.pid # 服务器进程ID保存的文件路径,默认为/var/lib/mysql/mysql.pid
bind-address = 127.0.0.1 # 服务器绑定的IP地址,默认为本地回环地址
# ----------------- 日志配置 -----------------
log-error = /var/log/mysql/error.log # 错误日志文件路径,默认为/var/log/mysql/error.log
slow-query-log = 1 # 是否启用慢查询日志,1表示启用,0表示禁用,默认为禁用
slow-query-log-file = /var/log/mysql/slow.log # 慢查询日志文件路径,默认为/var/log/mysql/slow.log
# ----------------- 缓存配置 -----------------
query_cache_type = 1 # 查询缓存类型,1表示启用,0表示禁用,默认为禁用
query_cache_size = 32M # 查询缓存大小,默认为32M
query_cache_limit = 2M # 查询缓存单个查询的最大缓存大小,默认为2M
# ----------------- 字符集配置 -----------------
character-set-server = utf8mb4 # 服务器使用的字符集,默认为utf8mb4
collation-server = utf8mb4_unicode_ci # 服务器使用的字符集排序规则,默认为utf8mb4_unicode_ci
# ----------------- 默认存储引擎 -----------------
default-storage-engine = InnoDB # 默认使用的存储引擎,默认为InnoDB
# ----------------- InnoDB配置 -----------------
innodb_buffer_pool_size = 256M # InnoDB缓冲池大小,默认为256M
innodb_flush_log_at_trx_commit = 2 # 日志刷新策略,2表示每秒刷新,默认为每次事务提交刷新
innodb_log_buffer_size = 8M # InnoDB日志缓冲区大小,默认为8M
innodb_file_per_table = 1 # 是否为每个InnoDB表使用单独的表空间,1表示启用,0表示禁用,默认为启用
innodb_open_files = 400 # InnoDB打开的文件数量,默认为400
# ----------------- 网络和连接配置 -----------------
max_connections = 1000 # 最大并发连接数,默认为1000
max_allowed_packet = 16M # 允许的最大数据包大小,默认为16M
skip_external_locking = 1 # 是否禁用外部锁定,默认为是
# ----------------- 安全性配置 -----------------
secure-file-priv = /var/lib/mysql-files # 加载数据文件的安全目录,默认为/var/lib/mysql-files
sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 服务器的SQL模式,默认为NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
附录 B mysql常见内置函数
一、字符串函数
cs
-- ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL
SELECT ASCII("dd");-- 100
SELECT ASCII("dc");-- 100
-- CONCAT(str1,str2,...):返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式
select CONCAT('My', 'S', 'QL'); -- MySQL
select CONCAT('My', NULL, 'QL'); -- NULL
select CONCAT(14.3); -- 14.3
-- LENGTH(str):返回字符串str的字节长度
select LENGTH('text'); -- 4
select LENGTH('字符串');-- 9
-- CHAR_LENGTH(str):用于获取字符串长度
select CHAR_LENGTH('text'); -- 4
select CHAR_LENGTH('字符串');-- 3
-- LOCATE(substr,str):返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0
select LOCATE('bar', 'foobarbar'); -- 4
select LOCATE('xbar', 'foobar'); -- 0
-- INSTR(str,substr):返回子串substr在字符串str中的第一个出现的位置
select INSTR('foobarbar', 'bar'); -- 4
select INSTR('xbar', 'foobar'); -- 0
-- LEFT(str,len)/RIGHT(str,len):返回字符串str的最左/右面len个字符
select LEFT('foobarbar', 5); -- fooba
select RIGHT('foobarbar', 4); -- rbar
-- SUBSTRING(str,pos):从字符串str的起始位置pos返回一个子串
select SUBSTRING('foobarbar',5);-- arbar
-- TRIM(str):返回字符串str,所有前缀或后缀被删除了
select TRIM(' xbar ');-- xbar
-- LTRIM(str)/RTRIM(str):返回删除了其前/后置空格字符的字符串str。
select LTRIM(' xbar');-- xbar
select RTRIM('xbar ');--xbar
-- REPLACE(str,from_str,to_str):返回字符串str,其字符串from_str的所有出现由字符串to_str代替
select REPLACE('xbar', 'x', 'bar');-- barbar
-- REPEAT(str,count):返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL
select REPEAT('bar', 3);-- barbarbar
-- REVERSE(str):返回颠倒字符顺序的字符串str。
select REVERSE('bar');-- rab
-- INSERT(str,pos,len,newstr):返回字符串str,在位置pos起始的子串且len个字符长的子串由字符串newstr代替。
select INSERT(whatareyou', 5, 3, is');-- whatisyou
-- strcmp(str1,str2):用于比较两个字符串的大小。左大于右时返回1,左等于右时返回0,,左小于于右时返回-1
SELECT strcmp('ab','ac');-- -1
-- 大写:upper(x),ucase(x);小写lower(x),lcase(x):字母大小写转换函数;
SELECT UPPER("abc");-- ABC
SELECT UCASE("abc");-- ABC
SELECT LOWER("ABC");-- abc
SELECT LCASE("ABC");-- abc
-- find_in_set(str1,str2):返回字符串str1在str2中的位置,str2包含若干个以逗号分隔的字符串(可以把str2看出一个列表,元素是多个字符串,查找结果是str1在str2这个列表中的索引位置,从1开始)
SELECT FIND_IN_SET('abc','123,456,abc');-- 3
-- field(str,str1,str2,str3...):与find_in_set类似,但str2由一个类似列表的字符串变成了多个字符串,返回str在str1,str2,str3...中的位置。
SELECT FIELD('abc','123','456','abc');-- 3
-- elt(index,str1,str2,str3...):获取指定位置的字符串
SELECT elt(3,'123','456','abc');-- abc
二、日期时间函数
cs
-- curdate()/current_date():获取当前日期
SELECT curdate();-- 2018-08-09
SELECT current_date();-- 2018-08-09
-- curtime()/current_time():获取当前时间
SELECT curtime();-- 15:38:54
SELECT current_time();-- 15:38:54
-- now():获取当前日期时间
select now();-- 2018-08-09 15:40:09
-- month(date),monthname(date):获取日期月份
SELECT MONTH (now());-- 8
SELECT monthname(now());-- August
-- week(date):获取日期周数
select week(now());-- 31
-- year(date):获取日期年数
select year(now());-- 2018
-- hour(time):获取时间时刻
select hour(now());-- 15
-- minute(time):获取时间分钟数
select minute(now());-- 47
-- DAYOFWEEK(date)/DAYNAME(date)/WEEKDAY(date):获取时间星期数
select DAYOFWEEK(NOW());-- 5
select DAYNAME(now());-- Thursday
select WEEKDAY(now());-- 3
-- DATE_ADD(date,INTERVAL expr type)/DATE_SUB(date,INTERVAL expr type):进行日期增加/减少的操作,可以精确到秒
SELECT '2018-08-09'+INTERVAL 1 DAY;-- 2018-08-10
SELECT '2018-08-09'-INTERVAL 1 SECOND;-- 2018-08-08 23:59:59
SELECT DATE_ADD('2018-08-08 23:59:59',INTERVAL 1 SECOND);-- 2018-08-09 00:00:00
SELECT DATE_SUB('2018-08-09 00:01:01',INTERVAL '1:1' MINUTE_SECOND);-- 2018-08-09 00:00:00
-- date_format('time','format')/time_format(time,format):日期时间转换为字符串
select date_format(now(), '%Y%m%d%H%i%s');-- 20180809160315
select time_format(now(),'%H:%i:%s');--16:03:15
-- str_to_date(str, format):字符串转换为日期
select str_to_date('08.09.2018 16:06:30', '%m.%d.%Y %H:%i:%s');-- 2018-08-09 16:06:30
-- makdedate(year,dayofyear)/maketime(hour,minute,second):拼凑日期、时间函数
select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
select maketime(12,15,30); -- '12:15:30'
-- unix_timestamp()/unix_timestamp(date)/from_unixtime(unix_timestamp)/from_unixtime(unix_timestamp,format):Unix 时间戳、日期转换函数
select unix_timestamp(); -- 1533802315
select unix_timestamp(now());-- 1533802315
select from_unixtime(1533802315); -- 2018-08-09 16:11:55
select from_unixtime(1533802315, '%Y%m%d%H%i%s'); -- 20180809161155
三、数学函数
cs
-- ABS(X):返回X的绝对值
select ABS(-32);-- 32
-- MOD(N,M)或%:返回N被M除的余数
select MOD(15,7);-- 1
select 15 % 7; -- 1
-- FLOOR(X):返回不大于X的最大整数值
select FLOOR(1.23); -- 2
select FLOOR(-1.23); -- -2
-- CEILING(X)/ceil(x):返回不小于X的最小整数值
select CEILING(1.23);-- 2
select CEILING(-1.23); -- -1
-- ROUND(X) :返回参数X的四舍五入的一个整数。
select ROUND(1.58); -- 2
select ROUND(-1.58); -- -2
-- round(x,y):返回数值x带有y为小数结果的数值(四舍五入)
SELECT round(3.1415926,2);-- 3.14
-- rand():返回随机数
select rand();-- 0.5911854436538978
-- truncate(x,y):返回数值x截取y位小数的结果(不四舍五入)
select truncate(3.1415926,4);-- 3.1415
四、逻辑函数
cs
-- CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END:在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。
SELECT
CASE 1
WHEN 1 THEN
2
ELSE
3
END;-- 2
-- IF(expr1,expr2,expr3):如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定
SELECT IF(1>2,2,3);-- 3
-- STRCMP(expr1,expr2):如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1
select STRCMP('text', 'text2');-- -1
-- SELECT IFNULL(expr1,expr2):如果expr1为空则返回expr2否则返回expr1
SELECT IFNULL(1,2);-- 2
五、加密函数
cs
-- MD5(str):函数可以对字符串str进行加密。MD5(str)函数主要对普通的数据进行加密。下面使用MD5(str)函数为字符串"abcd"加密
SELECT MD5('abcd');-- e2fc714c4727ee9395f324cd2e7f331f
-- ENCODE(str,pswd_str):函数可以使用字符串pswd_str来加密字符串str。加密的结果是一个二进制数,必须使用BLOB类型的字段来保存它。
SELECT ENCODE("abcd","evan");
-- DECODE(crypt_str,pswd_str)函数可以使用字符串pswd_str来为crypt_str解密。crypt_str是通过ENCODE(str,pswd_str)加密后的二进制数据。字符串pswd_str应该与加密时的字符串pswd_str是相同的。下面使用DECODE(crypt_str,pswd_str)为ENCODE(str,pswd_str)加密的数据解密。
SELECT DECODE(ENCODE("abcd","evan"),"evan");