目录
用户切换
1、为减少操作复杂度,使用sudo -i指令切换至管理员账户(未设管理员账户的密码则直接进入)
2、使用id -u指令判断当前用户是否是管理员账户:是则输出为0,不是则输出其它数字
MySQL的安装
默认下载目前的最新版本
1、使用dpkg-query -l | grep mysql指令列出所有已安装的与 "mysql" 相关的软件包及其版本信息,确保系统中没有残留的旧版 MySQL 安装包或冲突的包文件,这样可以避免新安装的版本与现有的 MySQL 版本发生冲突或导致兼容性问题
2、使用apt update指令获取最新的软件包信息,以确保你系统上的各种软件包列表是最新的
3、使用apt install mysql-server指令安装最新版本的mysql(记得安装完后再检查一下)
4、安装完成后,MySQL 服务应自动启动,可以使用systemctl status mysql指令检查 MySQL 服务的状态(我查询的时间是17:10而不是自动启动时的16:58,故已安装成功)如果服务器未启动可以使用systemctl start mysql指令启动mysql
通过ps ajx | grep mysql指令可以检查当前是否有mysql的进程在运行,并列出相关信息
5、为提高安全性,建议使用mysql_secure_installation指令运行MySQL的安全配置脚本并完成一系列操作(不做赘述自行了解)
MySQL的初步使用
登录与退出
1、当 MySQL 运行在本机,且监听的默认端口为3306时(安装后不修改mysql的配置文件,则mysql的默认监听端口号一直是3306)直接使用mysql -u root -p指令便,可连接本地的 MySQL 服务器(默认套接字连接),如果有密码则输入密码,没密码直接按Enter(后续必须设置密码)
后续可能使用类似于mysql -h 127.0.0.1 -P 3306 -u root -p的指令登录mysql
- -h 127.0.0.1:指明登录部署了mysql的主机(省略
-h
,则默认从本地登录(localhost
) ) - -P 3306:指明要访问的端口号
- -u root:指明登录的用户(
root
是 MySQL 的默认超级管理员账户,安装 MySQL 后,默认仅允许root
从本地登录(localhost
)) - -p:指明需要输入密码(与Linux一样,输入的密码不会显示)
2、使用exit指令退出mysql
Linux和mysql中的普通用户和root用户
情景假设:如果我是LInux系统中的一个普通用户张三,现在我自己进入了mysql,此时我在mysql客户端中的用户名称是什么?我作为mysql的普通用户可以自行提权到mysql的超级用户吗?作为mysql的普通用户我如何访问Linux中的/var/lib/mysql 目录?
1、当以普通 Linux 用户 张三 进入 MySQL 客户端,那么你在mysql客户端的用户名称取决于-u选项后的内容,如果是以-u root的方式登录,那么你就是mysql客户端的超级用户、如果以-u xxx的方式登录,那么你就是mysql客户端的一名叫xxx的普通用户、如果不用-u选项直接登录,那么你在mysql客户端就是一个叫张三的普通用户
2、不能! MySQL 的权限系统与 Linux 的
sudo
机制不同,普通 MySQL 用户无法随意提升为root,除非在登录时采用-u root的方式 或者
MySQLroot
账户已授予您更高权限
3、不能!
/var/lib/mysql
归属于 Linuxmysql
用户,只有 Linux的mysql
用户和root
用户可以访问/var/lib/mysql,而
Linux的mysql
用户是当你安装 MySQL 服务器时,系统会自动创建一个mysql
用户(Linux 用户),这个用户专门用于运行 MySQL 服务器 (mysqld
) 进程
优点:即使攻击者获取了 MySQL
root
权限,也无法通过它直接控制系统文件或其他服务
查看、创建与使用
在 MySQL 等数据库系统中,SQL 语句通常以分号(;
)作为结束符
1、使用show databases;指令列出当前 MySQL 服务器上所有可用的数据库,Linux中的 /var/lib/mysql 目录是 MySQL 在 Linux 系统中的默认数据存储目录(需要Linux中的root权限才能进入),可以在该目录中找到新建的数据库文件
2、使用create database xxx;指令创建一个新的名叫xxx的数据库,创建后在Linux中的 /var/lib/mysql目录下可以看到新增的数据库文件,同时show databases;也可以看到可用的数据库多了一个
3、使用use xxx;指令使用/切换名为xxx的数据库(类似于cd /xxx),然后使用creata table xxx(字段名 数据类型 [约束]);指令在xxx数据库中创建一个名为xxx的表,接着使用insert into xxx(字段名1,字段名2,字段名3...)values(?,?,?...);指令向表中插数据,最后可以通过selete * from xxx;指令查询名为xxx表中的数据
基础语法:
create table 表名 (
字段名1 数据类型 [约束],
字段名2 数据类型 [约束],
...
);
简单应用
创建一个统计学生信息的数据库:create database school;创建school数据库、use school;进入该数据库、create table student(id int,name varchar(32),gender varchar(2));创建存放学生信息的名为student的表、select * from school;查看school数据库中所有的表
MySQL 数据库在 Linux 文件系统中的存储结构
基本概念:新建xxx数据库时在Linux的/var/lib/mysql下也会新建一个xxx目录、在该数据库中新建yyy表时在 /var/lib/mysql/xxx下会新建yyy文件,故数据库本质也是文件,只不过这些文件并不由程序员直接操作,而是交给了mysqld进行管理,采用数据库是因为虽然普通文件也提供了数据存储的功能,但还需要用户自行管理,而数据库可以让用户只负责提出数据填写的要求即可剩余事情不用关心
数据库、数据库服务、数据库管理系统(宏观)
基本概念:数据库指以特定结构存储在磁盘或内存中的数据集合(一种概念),而数据库服务指由数据库管理系统(DBMS) 提供的一种能进行数据存储、检索和管理的网络服务,常见的DBMS包括SQL Server、Oracle、MySQL等(使用netstat -lntp指令查看MySQL当前的网络连接状态,从而验证网络服务的说法)
✅ Client 发送 SQL 语句 → ✅ Server 解析并执行 → ✅ 操作数据库(DB)中的表(Table)
微观下的DBMS
基本概念:DBMS的客户端和服务器端的名字都不同,但是功能都类似,比如下载的DBMS是SQL Server,那么执行的环境与指令是下面这样的,类似于MySQL的mysql命令行
sqlcmd> SELECT name FROM sys.databases;
sqlcmd> GO
...
sqlcmd> CREATE TABLE Users (
ID INT IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(50),
Age INT
);
sqlcmd> GO
...
SQL语言及其分类DDL、DCL、DML
基本概念:SQL(Structured Query Language,结构化查询语言)是一种用于操作数据库的标准语言,可以将 SQL 语言分为 DDL(Data Definition Language)(数据定义语言,负责“创建和修改数据库结构”)、DML(Data Manipulation Language)(数据操作语言,负责“对数据进行增删改查”)、DCL(Data Control Language)(数据控制语言,负责“用户权限管理”)、TCL(Transaction Control Language)(事务控制语言,负责“事务控制”)
注意事项:SQL 在不同的DBMS中的差异,可以类比于 C++ 和 Java 等编程语言的关系。即基本语法和核心概念相似,但处理时都是按照自己的SQL解析规则进行的(C++和JAVA都基于C,但是在编译器处理指令时不会把它们的指令都转换为C语言再执行,类似地,SQL Server 不会把 SELECT TOP 10
转换成 MySQL 的 LIMIT 10
语句再执行,而是直接按照自己的 SQL 解析器处理指令)
MySQL中数据库的常见操作
清屏指令是system clear
字符集和校验规则
字符集:决定数据库如何存储和表示文本数据,即一个字符在数据库中如何编码成二进制数据
比如UTF-8字符集(多字节字符集,每个字符占多个字节)能存储几乎所有语言的字符,适用于国际化应用,如支持中、英、法等多种语言的系统;而Latin1字符集(单字节字符集,每个字符只占用一个字节)只适用于西欧语言
校验集:定义字符串的比较和排序规则,即数据库如何判断两个字符串是否相等,或如何进行排序
比如
utf8_bin校验集
进行二进制比较,即完全按照字符的编码值来比较和排序("Hello" 和 "hello" 被认为是不同的);而MySQL的默认校验集utf8_general_ci对大小写不敏感(
"Hello" 和 "hello" 视为相同)
1、使用show variables like 'character_set_database';指令查看系统默认字符集
2、使用show variables like 'collation_database';指令查看系统默认字符集的校验规则
3、使用show charset;指令查看数据库支持的字符集
4、使用show collation;指令查看数据库支持的字符集校验规则(太多了不展示)
简单验证
1、创建两个使用不同校验集的数据库t1和t2,此时它们都使用我的MySQL系统中的默认字符集utf8m64:
2、 分别进入t1和t2数据库并在它们中都建一张表,并插入数据进行查找,发现字符集相同但是比较集不同时查找到的结果可能不同
删除数据库
指令:drop database 数据库名称;
注意事项:不建议直接删除数据库,因为所有表和数据都会消失,无法直接恢复(除非有备份),MySQL 不会有确认提示,除非你手动设置了保护机制
查看当前数据库
指令:select database();
修改数据库的字符集和校验集
注意事项:在 MySQL 中,数据库本身不能直接修改,但你可以通过 修改字符集、重命名数据库、调整权限 等方式来间接修改数据库,且只影响当前数据库中后续新建的表,不会改变已有表的数据编码方式
修改数据库字符集指令:alter database 数据库名 characterset=字符集;
修改数据库校验集指令:
- 修改后的校验集与原子字集兼容,例如将
utf8mb4_general_ci
改为utf8mb4_unicode_ci
(同属utf8mb4
字符集):alter database 数据库名 collate 校验规则; - 修改后的校验集与原字符集不兼容,例如从
latin1_swedish_ci
改为utf8mb4_unicode_ci
:alter database 数据名库 characterset=字符集 collate 校验规则;
修改现有表的字符集和校验集指令:alter table 现有表名 convert to characterset 字符集 collate校验规则;
注意事项:转换字符集可能导致数据丢失,核心原则是数据一致性 > 性能 > 灵活性
查看MySQL 数据库的创建语句(包括其字符集等信息)
指令:show create database 数据库名;
- Database:数据库的名称
- Create Database :创建该数据库所需的 SQL 语句,其中包含数据库的字符集设置(mm数据库的字符集是utf8mb4,校验集是utf8mb4_0900_ai_ci)
数据库的排序
指令:order by 列名 [ASC升序 / DESC降序];(升序从小到大,降序从大到小)
注意事项:如果未指定排序顺序,ORDER BY
默认使用升序
1、使用select * from school order by age;指令查询 school
表,按年龄升序排列
2、使用select * from school order by score DESC;指令查询 school
表,按分数降序排列
3、使用select * from school order by height DESC,weight ASC;首先按身高升序排列;如果身高相同,再按体重降序排列(受到身高排序的影响,提供的排序是混乱的)
数据库的备份与恢复
使用工具:mysqldump(安装MySQL时自带)
备份单个数据库:使用mysqldump -u root -p school > school.sql;指令将school数据库备份到school.sql文件中(.sql文件被放在Linux中进入mysql命令行前的目录中保存,也可使用绝对路径进行指明)
-u root:是为了能由足够的权限进行备份
-p密码:指定连接当前MySQL的密码,密码要紧跟-p
备份多个数据库:使用mysqldump -u root -p --databases school mm > all.sql;指令将school数据库和mm数据库统一备份到all.sql文件中
备份数据库中的某些表:使用mysqldump -u root -p school students teacher > school_tables_backup.sql;指令将school数据库中的两个表students和teachers备份到school_tables_backup.sql文件中
仅备份数据库中的结构:使用mysqldump -u root -p --no-data school > school_structure.sql;指令将school数据库中以不包含数据的方式备份到school_structure.sql文件中
恢复备份:使用mysql -u root -p school < school.sql;指令将备份恢复到school数据库(恢复前要先创建一个空间school数据库)
注意事项:备份的是该数据库以前历史上的所有操作,包括操作中涉及的数据,恢复时会把这些操作全部再运行一次,这样就得到一份一模一样的数据库
查看数据库的连接状态
指令:show processlist;(发现数据库运行缓慢时使用)
- Id:进程的唯一标识符。例如,
5
和23
是当前活动进程的 ID - User:执行查询的用户。比如
event_scheduler
和root
- Host:发起连接的主机。比如,两个进程的主机都是
localhost
- db:当前进程连接的数据库。在这张图中,
event_scheduler
进程未连接数据库,而root
进程连接了school
数据库 - Command:表示进程当前正在执行的命令类型。例如,
Daemon
表示事件调度器,Query
表示正在执行 SQL 查询 - Time:进程已执行的时间(以秒为单位)。例如,
event_scheduler
已运行了99874
秒,而root
进程的执行时间为0
秒 - State:进程当前的状态。例如,
Waiting on empty queue
表示事件调度器在等待一个空队列,init
表示root
进程刚开始初始化查询 - Info:显示有关进程的附加信息。
event_scheduler
进程没有附加信息,而root
进程正在执行show processlist
查询
MySQL中表的常见操作
表的创建
完整语法:
create table 表名 (
列名1 列中所存储数据的数据类型 列的约束条件用于限制列中的数据 comment '对于列中数据的提示语',
列名2 列中所存储数据的数据类型 列的约束条件用于限制列中的数据 comment '对于列中数据的提示语',
列名3 列中所存储数据的数据类型 列的约束条件用于限制列中的数据 comment '对于列中数据的提示语',
...
[表级约束]
)charste=表的字符集 collate 表的校验规则 engine 存储引擎;
- 如果没有设定字符集和校验规则,那么就按照当前表所在数据库的字符集和校验规则
采用不同存储引擎建立的表在Linux中文件的个数也不同,user1表采用MyISAM存储引擎,user2表采用InnoDB存储引擎,前者的对应文件个数为2.MYD和.MYI,后者为1.ibd
表的查看
1、查看当前数据库的所有表:show tables;
2、查看某个表的结构:desc 表名;
- Field:字段/列名字
- Type:字段类型
- Null:是否允许该字段为空。值可以是
YES
或NO
- Key:索引类型
- Default:字段的默认值。如果没有插入数据时指定该字段的值,数据库会使用该默认值
- Extra:扩充
3、查看创建表时的详细操作信息:show create table 表名 \G(这里不用冒号)
- 虽然在建表时命令输入可能不够规范和整齐,但当 MySQL 服务器接收到客户端请求后,会对语法进行分析和整理,最终在查询结果中展示出整洁的命令
表的插入
指令:insert into 表名 values(数据1,数据2...);(该表必须已经存在)
表的修改
1、修改表名:alter table 旧表名 rename to 新表名;
2、 添加字段:alter table 表名 add 新字段名 字段的数据类型 comment '图片路径' after Field;(不加after Field也行,然后新字段名就会在birthday后了)
补充:如果我们此时再show create table user \G会发现虽然是后来新增的插入但是仍然会被整齐的放入()中
3、 修改字段的属性:alter table 表名 modify 字段名 属性 ...;(..表示后续的一些内容要补全防止覆盖掉原来后面的comment等内容)
4、删除字段:alter table 表名 drop 字段名;(删除后该字段原本的数据都会被删除,要小心)
5、修改字段名:alter table 表名 change 旧字段名 新字段名 数据类型...;(修改后的新字段需要重新完整定义一次,否则会报错)
表的删除
指令:drop table 表名;
!!不要轻易进行表的修改和删除!!
~over~