FChao
发布于 2025-09-09 / 36 阅读
0
0

LNMP基础:MariaDB篇

  • MariaDB 是 MySQL 的一个分支,mysql-server包和mariadb-server包无法同时存在。几乎所有主流编程语言都支持连接MySQL数据库。

  • MySQL、SQLite、PostgreSQL​、SQL Server 、Oracle、达梦均属于​​关系型数据库(RDBMS)​​,按照固定的结构存储数据(建表),数据可能依赖内存缓存加速,但最终都存储在硬盘里。遵循国际标准组织制定的 SQL 语法规范(如 SELECT、INSERT、JOIN等)。这保证了基础语法的高度一致性。

  • 非关系型数据库(NoSQL):没有传统关系型数据库的固定表结构模式。

  1. Redis 是内存数据结构服务器,采用键值模型存储多种数据类型(字符串、列表等),支持持久化与复杂操作;

  2. Memcached 是纯内存键值缓存,仅支持字符串且无持久化;

  3. MongoDB 是磁盘型文档数据库,以 BSON 格式存储结构化数据,支持类 SQL 查询。

三者均脱离 SQL 范式,但数据存储位置与结构灵活性存在显著差异:Redis/Memcached 数据主要驻留内存(其中 Memcached 无持久化),而 MongoDB 数据持久化于磁盘;Memcached 仅支持简单键值,Redis 支持多种数据结构。


1.PHP连接数据库

安装并连接到数据库

1.yum install -y mariadb mariadb-server

2.rpm -qc mariadb-server 查看配置文件目录

3.systemctl enable mariadb --now

4.netstat -tunalp | grep mariadb

  • 链接数据库

-h,--host,用于指定 MySQL 服务所在的主机名或 IP 地址,默认localhost

-p,小写p为交互式输入密码

-P,大写P指定端口,默认3306

-u,用户,直接登录是数据库的root用户,使用show grants;可以看到其拥有所有库所有表的最大权限。且可以把自己的权限复制给他人。

- 退出 exit

- select user(); 查看当前是哪个用户登录了数据库

  • 当直接在命令行输入mysql,等价于:

mysql -u$(whoami) -hlocalhost -P3306 -p

#小写p会提示输入密码

  • 先连接到数据库,执行指定命令,然后自动退出并返回到 Linux命令行(适合用于脚本)

mysql -u用户名 -p密码 -e "SHOW DATABASES;"

注:短格式的选项和参数可以无空格

5.检查php能否连接数据库

  • yum install php-mysqlnd -y

  • php -m | grep mysql列出支持的功能模块

    • mysqli​​

    • mysqlnd

    • ​​pdo_mysql

步骤

涉及数据库知识在下一标题中整理

1.创建用户

CREATE USER 'admin'@'localhost' IDENTIFIED BY '123456';

  • 作用:创建一个用户名为 admin、密码为 123456 的 MySQL 用户。

    • 'admin'@'localhost':用户 admin 只能从本地(localhost)连接数据库。

    • 密码需用双引号包裹(MySQL 8.0+ 也可用单引号)。

    • IDENTIFIED BY表示身份验证凭证


2.授予权限

GRANT ALL ON *.* TO 'admin'@'localhost';

  • 作用:授予用户 admin 所有数据库的所有权限*.* 表示“所有库.所有表”)。

  • ALL是 ALL PRIVILEGES的简写


3.创建数据库(建库)​​

MariaDB [(none)]> create database game;

可用show database; 查看已有的库进行确认


4.创建数据表(建表)​​

MariaDB [(none)]> create table game.user(name char(10), password char(6));

  • 在 game仓库里,​​建造了一个名为 user的表。这个表的结构被设计为可以存放两种货物:

    • name char(10):​​用户名​​,定义为最多10个字符的字符串。

    • password char(6):​​密码​​,定义为最多6个字符的字符串。


5.验证表是否创建成功​​

MariaDB [(none)]> use game; -- 进入(选择)game数据库

MariaDB [game]> show tables; -- 查看当前数据库中的所有表


6.使用php脚本验证是否能够连接并写入数据库,需要关闭SELinux

<?php
// 数据库配置(根据实际配置修改)
$db_host = 'localhost';
$db_user = 'admin';
$db_pass = '123456';
$db_name = 'game';

// 创建数据库连接
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);

// 检测连接
if ($conn->connect_error) {
    die("数据库连接失败: " . $conn->connect_error);
}

// 设置字符集防止中文乱码[2,6](@ref)
$conn->set_charset("utf8");

// 准备测试数据(符合char(10)和char(6)字段限制)
$test_name = "test_user";    // 用户名(10字符以内)
$test_pass = "123abc";       // 密码(6字符以内)

// 使用预处理语句防止SQL注入[1](@ref)
$stmt = $conn->prepare("INSERT INTO user (name, password) VALUES (?, ?)");
$stmt->bind_param("ss", $test_name, $test_pass);

// 执行插入操作
if ($stmt->execute()) {
    echo "数据写入成功!插入记录:";
    echo "用户名:$test_name,密码:$test_pass";
} else {
    echo "数据写入失败: " . $stmt->error;
}

// 关闭连接
$stmt->close();
$conn->close();
?>

补充:HCIP例题

86.在LNMP架构中,firewalld 需要在每个节点中都开启并配置。在 Nginx 服务器中,需要放通其对应的业务端口,同时需要放通访问数据库的端口。在数据库服务器中,需要放通对应的业务接口即可。
【错】

    防火墙并非强制开启,应根据​​节点角色和网络位置​​决定。例如,​​数据库节点​​通常部署在内网隔离区,若已通过安全组或物理防火墙隔离,则无需开启本地防火墙。
    Nginx作为反向代理,​​不直接连接数据库​​,而是将动态请求转发至PHP-FPM(如127.0.0.1:9000),由PHP应用连接数据库

补充:单引号和反引号

反引号 (`)​​

引用标识符​​(表名、列名等),类似SQL Server 中的 []

1.​​标识符是 MySQL 的保留关键字​​:如 SELECT * FROM `order`; 因为 order是一个关键字

2.​​标识符包含特殊字符或空格​​:如 SELECT `user-name` FROM `user data`;

3.标识符以数字开头​​:如 CREATE TABLE `2025data` ...

单引号 (')​​

​​定义字符串常量​​

SELECT * FROM users WHERE name = 'Alice';

2.用户管理

修改密码

1.设置管理员密码

mysqladmin -u root -p password

  • 在命令行中执行无需连接数据库

  • ​​password是固定关键字​​,表示要执行的操作是“修改密码”

  • 交互式,先输入旧密码再重复输入两次新密码

2.Alter修改用户密码

  • ALTER可操作表、库、索引、视图、用户等十多种对象,对这些已经建立的对象进行修改

  • ALTER [对象类型] [对象名称] [操作指令];

  • alter user root@localhost identified by "123456";

3.执行mysql_secure_installation

  • MySQL/MariaDB 官方提供的​​安全初始化脚本

Enter current password for root (enter for none):  ← 初次安装直接回车
Set root password? [Y/n] Y   设置 root 密码
New password: ********
Re-enter new password: ********
Remove anonymous users? [Y/n] Y   移除默认创建的匿名账户
Disallow root login remotely? [Y/n] Y  ​取消 root 用户的远程访问权限
Remove test database and access to it? [Y/n] Y  移除默认的 test数据库
Reload privilege tables now? [Y/n] Y  刷新权限表​​使上述修改立即生效
All done!

4.SET命令,在 MySQL 8.0 及更高版本中,​SET PASSWORD语法已被弃用,推荐使用Alter

MySQL 5.6 :SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

MySQL 8.0 :SET PASSWORD FOR 'root'@'localhost' = '新密码';


创建账号/GRANT授权

CREATE USER 'webadmin'@'localhost' IDENTIFIED BY '654321';
  • 主机名

​​'localhost'​​

只能从​​数据库服务器本机​​连接。

​​'192.168.1.100'​​

只能从指定的 ​​IP 地址​​ (192.168.1.100) 连接,应用部署在独立的服务器上时使用。

​​'192.168.1.%'​​

可以从指定的 ​​IP 段​​ (192.168.1.0/24) 连接。%是通配符,允许一个网段内的多个应用服务器连接。

​​'%'​​

可以​​从任何主机​​连接,非常不安全​​,通常仅用于测试环境或特殊需求。

在 MySQL 中,'user'@'localhost'和 'user'@'%'被认为是​​两个完全不同的用户​​,他们可以有各自的密码和权限。

GRANT SELECT, INSERT, UPDATE, DELETE ON buydb.* TO 'webadmin'@'localhost';
  • GRANT设置权限

SELECT(查询), INSERT(插入), UPDATE(更新), DELETE(删除)。还可以使用 ALL PRIVILEGES授予所有权限。

  • ​​权限作用范围​​ON buydb.*

  1. buydb是数据库名。

  2. .*表示该数据库下的​​所有表​​。也可以指定单张表,如 ON buydb.shop。

  • FLUSH PRIVILEGES;

  1. FLUSH是一个多功能命令,用于清除或重新加载各种内部缓存。

  2. PRIVILEGES具体指代的是 MySQL 中​​存储在系统表里的用户权限信息​​。

​​使用 GRANT、REVOKE、CREATE USER、ALTER USER这类标准的权限管理语句后,MySQL 会自动刷新权限,使更改立即生效,无需手动执行 FLUSH PRIVILEGES;​​

查看版本/库/切换库


评论