mysql

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言


数据库基础:从概念到MySQL实战全指南

本文整理了数据库核心知识,涵盖基础概念、发展历程、分类对比,以及MySQL 5.7编译安装与实战操作,适合作为学习笔记或技术参考。

一、数据库核心概念

1. 基础定义

  • 数据:描述客观事物的符号记录(数字、文字、图像、声音等),以统一格式的记录形式存储,相同类型数据分类存放(如"学生"数据独立于"图书"数据)。例如:班级同学信息中,一名同学是一条记录,包含学号、姓名、性别等属性。
  • :由行(记录)和列(字段)组成的核心结构,记录由字符/数字类型的字段构成,支持多用户共享,具有低冗余、高数据独立性特点。
  • 数据库:表的集合,是按特定组织方式存储的相关数据集合。MySQL中数据存储层级为:MySQL服务 → 数据库 → 数据表 → 行(记录)+ 列(字段)。
  • DBMS(数据库管理系统) :操作和管理数据库的软件,核心功能包括:
    1. 建库与维护(建表、数据转储与恢复、重组、性能监视);
    2. 数据定义(定义数据结构、存储结构、保密模式);
    3. 数据操作(查询、统计、更新);
    4. 运行管理(并发控制、存取控制、维护);
    5. 通信(与Access、Office等软件交互)。
  • DBS(数据库系统):人机系统,由硬件、操作系统、数据库、DBMS、应用软件和用户组成。用户可通过DBMS或应用程序操作数据库,DBA(数据库管理员)负责备份恢复、维护、用户管理。

2. 架构关联

数据库是LAMP/LNMP架构的核心组件:

  • LAMP = Linux + Apache + MySQL/MariaDB + PHP;
  • LNMP = Linux + Nginx + MySQL/MariaDB + PHP;
    在企业架构中,数据库用于存储核心数据,例如微信的聊天文字/语音/视频、外卖平台的订单/支付/商家数据、游戏的玩家信息/装备/战绩。

二、数据库发展与分类

1. 发展历程

  • 第一阶段(层次型/网状型):代表产品为IBM 1969年推出的IMS,数据通过复杂指针连接,结构不够直观。
  • 第二阶段(关系型) :1970年IBM研究员E.F. Codd提出"关系模型",核心是将数据存于二维表(行/列),用数学集合和关系代数操作数据(选择、投影、连接),数据更易查询维护。
    • 代表产品:IBM System R(首个关系模型实验性系统)、加州大学伯克利Ingres(衍生出PostgreSQL);
    • 意义:推动SQL(结构化查询语言)成为主流,现代MySQL、Oracle、SQL Server均源于此。
  • 第三阶段(新型数据库):特点是面向对象、开放性、多平台,采用SQL + NoSQL混合使用模式,代表产品有MariaDB、PostgreSQL、时序数据库Prometheus。

2. 两大核心类型对比

特点 关系型数据库 非关系型数据库(NoSQL)
数据结构 二维表 KV、文档、列式、图形等
优点 结构清晰、SQL通用、支持复杂查询 格式灵活、速度快、高扩展性、成本低
缺点 表结构固定、存在I/O瓶颈 无SQL支持、事务处理弱、复杂查询不足
代表产品 MySQL、Oracle、PostgreSQL Redis、MongoDB、HBase

3. 选型思路

  • 数据关系清晰、结构化场景:选关系型数据库;
  • 高并发、非结构化、大数据实时计算场景:选非关系型数据库;
  • 实际应用常混合使用(如Redis缓存+MySQL持久化)。

三、MySQL 5.7源码编译安装

1. 环境准备

  1. 安装依赖工具:

    bash 复制代码
    yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake

    (gcc/gcc-c++:编译工具;ncurses/ncurses-devel:字符终端交互库;bison:语法分析器;cmake:MySQL编译工具)

  2. 创建MySQL专用用户:

    bash 复制代码
    useradd -s /sbin/nologin mysql

2. 源码处理

  1. 解压源码包与boost包:

    bash 复制代码
    tar zxvf mysql-5.7.17.tar.gz -C /opt 
    tar zxvf boost_1_59_0.tar.gz -C /usr/local/
    mv /usr/local/boost_1_59_0 /usr/local/boost

3. 编译配置

  1. 进入源码目录:

    bash 复制代码
    cd /opt/mysql-5.7.17/
  2. 执行cmake配置(关键参数):

    bash 复制代码
    cmake \
    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \  # 安装路径
    -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \  # 监听套接字路径
    -DSYSCONFDIR=/etc \  # 配置文件路径
    -DSYSTEMD_PID_DIR=/usr/local/mysql \  # 进程文件路径
    -DDEFAULT_CHARSET=utf8 \  # 默认字符集
    -DDEFAULT_COLLATION=utf8_general_ci \  # 字符集校对规则
    -DWITH_EXTRA_CHARSETS=all \  # 支持所有字符集
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \  # 安装InnoDB引擎
    -DWITH_ARCHIVE_STORAGE_ENGINE=1 \  # 安装ARCHIVE引擎
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  # 安装BLACKHOLE引擎
    -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \  # 安装PERFSCHEMA引擎
    -DMYSQL_DATADIR=/usr/local/mysql/data \  # 数据库文件路径
    -DWITH_BOOST=/usr/local/boost \  # boost路径
    -DWITH_SYSTEMD=1  # 支持systemctl管理
  3. 编译安装:

    bash 复制代码
    make -j 4 && make install      (根据CPU数量定)

    (注意:CMake出错需删除CMakeCache.txt后重新执行)

4. 配置优化

  1. 权限设置:

    bash 复制代码
    chown -R mysql:mysql /usr/local/mysql/
    chown mysql:mysql /etc/my.cnf
  2. 修改配置文件/etc/my.cnf

    ini 复制代码
    [client]
    port = 3306
    socket=/usr/local/mysql/mysql.sock
    default-character-set=utf8
    
    [mysqld]
    user = mysql
    basedir=/usr/local/mysql
    datadir=/usr/local/mysql/data
    port = 3306
    character-set-server=utf8
    pid-file = /usr/local/mysql/mysqld.pid
    socket=/usr/local/mysql/mysql.sock
    bind-address = 0.0.0.0  # 允许任意IP连接
    skip-name-resolve  # 关闭DNS解析,提高连接速度
    max_connections=2048  # 最大连接数
    default-storage-engine=INNODB  # 默认存储引擎
    max_allowed_packet=16M  # 最大数据包大小
    server-id = 1  # 唯一ID(主从复制用)
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
    
    [mysql]
    port = 3306
    default-character-set=utf8
    socket=/usr/local/mysql/mysql.sock
    auto-rehash  # 命令行自动补全

5. 环境变量与初始化

  1. 设置环境变量:

    bash 复制代码
    echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    source /etc/profile
  2. 数据库初始化:

    bash 复制代码
    cd /usr/local/mysql/bin/
    ./mysqld \
    --initialize-insecure \
    --user=mysql \
    --basedir=/usr/local/mysql \
    --datadir=/usr/local/mysql/data

6. 服务管理与登录

  1. 配置systemd服务:

    bash 复制代码
    cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
    systemctl daemon-reload
    systemctl start mysqld.service
    systemctl enable mysqld  # 开机自启
    netstat -anpt | grep 3306  # 验证端口
  2. 设置root密码与登录:

    bash 复制代码
    mysqladmin -u root -p password "123456"  # 设置密码(初始无密码,直接回车)
    mysql -u root -p123456  # 登录


四、MySQL数据库管理操作

1. 基本操作

  • 查看数据库SHOW DATABASES;(显示所有数据库列表);
  • 切换数据库USE 数据库名;(切换当前操作数据库);
  • 查看表SHOW TABLES;(当前数据库)或SHOW TABLES IN 数据库名;(指定数据库);
  • 查看表结构DESCRIBE 表名;(输出字段名、类型、是否为空、主键、默认值、额外属性)。

2. 常用数据类型

类型 说明 示例
INT 整型(存储整数) id INT
FLOAT 单精度浮点(4字节,小数) score FLOAT
DOUBLE 双精度浮点(8字节) price DOUBLE
CHAR(n) 固定长度字符(不足补空格) name CHAR(10)
VARCHAR(n) 可变长度字符(最大n个) address VARCHAR(50)
TEXT 文本类型 description TEXT
IMAGE 图片类型 photo IMAGE
DECIMAL(p,s) 精确数值(p总长度,s小数位) salary DECIMAL(5,2)

3. 文件存储结构

  • MySQL数据目录:/usr/local/mysql/data(每个数据库对应一个子目录);
  • MyISAM表:对应3个文件------.frm(表结构)、.MYD(数据)、.MYI(索引);
  • InnoDB表
    • 独享表空间:每表1个.ibd文件;
    • 共享表空间:多表共用ibdata文件。

4. SQL语句分类及操作

(1)DDL(数据定义语言):管理数据库/表结构
  • 创建数据库CREATE DATABASE 数据库名;

  • 创建表

    sql 复制代码
    CREATE TABLE 表名 (
      字段1 数据类型 [约束条件],
      字段2 数据类型 [约束条件],
      PRIMARY KEY (主键字段)  # 主键约束
    );

    示例:

    sql 复制代码
    CREATE DATABASE szsx_school;
    USE szsx_school;
    CREATE TABLE yjs0805 (
      id INT NOT NULL,  # 非空约束
      name CHAR(10) NOT NULL,
      score DECIMAL(5,2),
      passwd CHAR(48) DEFAULT '',  # 默认值约束
      PRIMARY KEY (id)  # 主键
    );
  • 删除表DROP TABLE 表名;DROP TABLE 数据库名.表名;(不切换数据库);

  • 删除数据库DROP DATABASE 数据库名;

  • 修改表结构(ALTER)

    • 改表名:ALTER TABLE 旧表名 RENAME 新表名;
    • 增字段:ALTER TABLE 表名 ADD 字段名 数据类型 [约束];
    • 改字段名/类型:ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [约束];ALTER TABLE 表名 MODIFY COLUMN 字段名 数据类型;
    • 删字段:ALTER TABLE 表名 DROP 字段名;
(2)DML(数据操纵语言):管理表数据
  • 插入数据INSERT INTO 表名(字段1,字段2,...) VALUES (值1, 值2, ...);
    示例:INSERT INTO KY13 (id, name, score, passwd) VALUES (1,'zhangsan',70.5,PASSWORD('123456'));
  • 更新数据UPDATE 表名 SET 字段1=值1[,字段2=值2] WHERE 条件;
    示例:UPDATE KY13 SET passwd=PASSWORD('') WHERE name='zhangsan';
  • 删除数据DELETE FROM 表名 WHERE 条件;
  • 清空表
    • DELETE FROM 表名;(可回滚,速度慢,自增ID不重置);
    • TRUNCATE TABLE 表名;(不可回滚,速度快,自增ID重置)。
(3)DQL(数据查询语言):查询数据
  • 基础查询:SELECT 字段1,字段2 FROM 表名 WHERE 条件;SELECT * FROM 表名;(查所有字段);
  • 限制结果:SELECT * FROM 表名 LIMIT 起始行, 查询条数;(如LIMIT 2显示前2行,LIMIT 2,3从第2行起显3行);
  • 竖向显示:SELECT * FROM 表名\G
(4)DCL(数据控制语言):权限管理
  • 授权GRANT 权限列表 ON 数据库.表 TO '用户名'@'来源地址' IDENTIFIED BY '密码';
    示例:GRANT SELECT ON school.* TO 'zhangsan'@'localhost' IDENTIFIED BY 'abc123';(本地用户zhangsan获school库查询权);GRANT ALL PRIVILEGES ON *.* TO 'lisi'@'%' IDENTIFIED BY '123456';(任意IP用户lisi获所有权限);
  • 刷新权限FLUSH PRIVILEGES;(授权后生效);
  • 查看授权SHOW GRANTS FOR '用户名'@'来源地址';
  • 撤销权限REVOKE 权限列表 ON 数据库.表 FROM '用户名'@'来源地址';
    示例:REVOKE ALL ON *.* FROM 'lisi'@'%';

5. 高级表操作

  • 临时表CREATE TEMPORARY TABLE 表名 (...);(仅存在于当前连接,连接关闭自动销毁,支持增删改查);
  • 克隆表
    • 仅复制结构:CREATE TABLE 新表 LIKE 旧表;(需手动插入数据:INSERT INTO 新表 SELECT * FROM 旧表;);
    • 复制结构+数据:CREATE TABLE 新表 AS SELECT * FROM 旧表;

6. 用户与权限管理

(1)用户操作
  • 创建用户CREATE USER '用户名'@'来源地址' IDENTIFIED BY '密码';localhost本地登录,%任意IP登录);
  • 查看用户USE mysql; SELECT User, Host, authentication_string FROM user;
  • 删除用户DROP USER '用户名'@'来源地址';
  • 修改密码
    • 当前用户:SET PASSWORD = PASSWORD('新密码');
    • 其他用户:SET PASSWORD FOR '用户'@'来源地址' = PASSWORD('新密码');
(2)忘记root密码处理
  1. 修改/etc/my.cnf,在[mysqld]下添加:skip-grant-tables
  2. 重启服务:systemctl restart mysqld,直接登录(mysql);
  3. 修改密码:UPDATE mysql.user SET AUTHENTICATION_STRING=PASSWORD('新密码') WHERE user='root'; FLUSH PRIVILEGES;
  4. 删除skip-grant-tables,重启服务:systemctl restart mysqld

7. 常用权限说明

权限 功能
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
CREATE 创建数据库/表
DROP 删除数据库/表
INDEX 建立索引
ALTER 修改表结构
EXECUTE 执行存储过程
ALL PRIVILEGES 所有权限
相关推荐
YQ_011 小时前
ubuntu22.04及以上,安装中文输入法
linux·运维·服务器
一周困⁸天.1 小时前
K8S-Pod资源对象
linux·容器·kubernetes
python百炼成钢1 小时前
45.Linux I2C 驱动
linux·运维·服务器·驱动开发
k***81721 小时前
使用Canal将MySQL数据同步到ES(Linux)
linux·mysql·elasticsearch
last demo2 小时前
Linux 正则表达式
linux·mysql·正则表达式
fiveym2 小时前
CentOS 7 部署 isc-dhcp-server(PXE 场景专属,含完整配置 + 避坑指南)
linux·运维·centos
Ghost Face...2 小时前
V4L2架构与硬件适配全解析
linux·架构
繁华似锦respect2 小时前
C++ 设计模式之工厂模式详细介绍
java·linux·c++·网络协议·设计模式
Linux技术芯2 小时前
浅谈scsi协议的命令描述符CDB工作原理
linux