首页 领读 A-AA+ 发书评 收藏 书签 朗读 手机

             

第3章:数据持久层 —— 数据库安装与基础配置

现代服务器架构实战:部署、性能、扩展与安全 by 创客秀

2025-11-10 13:07

数据是应用的生命血液,而数据库则是存储和管理这些血液的心脏。一个配置得当的数据库,能够确保数据的完整性、服务的稳定性,并为未来的性能优化打下坚实基础;反之,一个脆弱的数据库系统,将成为整个架构中最致命的单点故障。本章将聚焦于两大开源关系型数据库巨头——MySQL与PostgreSQL,带你从零开始,完成从安装、安全加固到基础优化的全流程,为你构建一个可靠的数据持久层。


3.1 MySQL / PostgreSQL 安装与安全初始化

3.1.1 安装决策:包管理器 vs 官方仓库

  • 使用操作系统包管理器(推荐用于初学者和大多数场景)

    • 优点:简单、快捷,与系统集成度高(如服务管理、依赖解决)。

    • 示例(Ubuntu/Debian):

      bash

      复制下载

      # 安装 MySQLsudo apt updatesudo apt install mysql-server# 安装 PostgreSQLsudo apt updatesudo apt install postgresql postgresql-contrib
    • 示例(Rocky Linux/RHEL):

      bash

      复制下载

      # 启用EPEL仓库(如需)并安装MySQL (MariaDB)sudo dnf install mariadb-server mariadb# 安装 PostgreSQL(可能需要先启用特定仓库)sudo dnf install postgresql-server postgresql-contrib
  • 使用官方提供的仓库(适用于需要特定最新版本或对版本有严格要求的场景)

    • 优点:能获得比系统仓库更新的版本,享受最新的特性与性能改进。

    • 流程:通常需要从MySQL或PostgreSQL官网下载并添加官方仓库的GPG密钥和源,然后再通过包管理器安装。

3.1.2 至关重要的安全初始化脚本

安装完成后,默认配置存在严重安全风险(如空密码、测试数据库等),必须立即进行安全加固。

  • MySQL / MariaDB 安全配置

    • 运行内置的安全初始化脚本:

      bash

      复制下载

      sudo mysql_secure_installation
    • 脚本会交互式地引导你完成以下关键步骤

    1. 设置root密码:为超级用户设置一个强密码。

    2. 移除匿名用户:删除允许任何人无需密码登录的测试账户。

    3. 禁止root远程登录:确保数据库超级用户只能从本地服务器登录。

    4. 移除测试数据库:删除默认创建的名为 test 的公开访问数据库。

    5. 重新加载权限表:使上述安全设置立即生效。

  • PostgreSQL 安全配置

    • PostgreSQL默认采用“Peer Authentication”,postgres超级用户只能由系统级postgres用户通过本地Socket连接。这本身是一种安全实践。

    • 初始步骤

    1. 切换到postgres系统用户:

      bash

      复制下载

      sudo -u postgres psql
    2. psql命令行中,修改postgres用户的密码:

      sql

      复制下载

      ALTER USER postgres WITH PASSWORD 'your-strong-password';
    3. (可选但推荐)创建一个用于日常管理的专用用户和数据库,避免直接使用postgres超级用户。


3.2 核心配置文件详解

数据库的性能和行为主要由其配置文件控制。理解并调优这些文件至关重要。

  • 3.2.1 MySQL 配置文件 (my.cnf)

    • 文件位置:可能位于 /etc/mysql/my.cnf/etc/my.cnf, 或 /etc/mysql/mysql.conf.d/mysqld.cnf

    • 核心参数

      ini

      复制下载

      [mysqld]# 基础设置datadir = /var/lib/mysql    # 数据存储目录socket = /var/lib/mysql/mysql.sock# 网络与连接bind-address = 127.0.0.1     # 至关重要!初始应绑定本地,如需远程,改为服务器IPport = 3306max_connections = 100        # 最大连接数,根据服务器内存调整# 内存与缓存设置(初步优化)key_buffer_size = 256M       # 用于MyISAM引擎的索引缓存(即使使用InnoDB也建议保留)innodb_buffer_pool_size = 1G # InnoDB引擎最重要的参数!设置为可用内存的50%-70%query_cache_size = 0         # 查询缓存,在MySQL 8.0中已被移除,在5.7中建议关闭(0)# 日志slow_query_log = 1           # 启用慢查询日志,用于性能分析slow_query_log_file = /var/log/mysql/mysql-slow.loglong_query_time = 2          # 定义“慢查询”的阈值(秒)
  • 3.2.2 PostgreSQL 配置文件 (postgresql.conf)

    • 文件位置:通常位于 /var/lib/pgsql/data/postgresql.conf 或 /etc/postgresql/{version}/main/postgresql.conf

    • 核心参数

      ini

      复制下载

      # 连接与认证listen_addresses = 'localhost' # 同MySQL,初始设为localhost。远程访问时改为'*'或特定IPport = 5432max_connections = 100# 内存设置shared_buffers = 256MB        # 共享内存缓冲区,建议为系统内存的25%work_mem = 4MB                # 每个查询操作(排序、哈希)可用的内存,可适当调高# 预写日志(WAL) - 对于数据安全和性能至关重要wal_level = replica           # 允许流复制,为高可用做准备synchronous_commit = on       # 保证数据一致性,对性能有轻微影响,生产环境建议开启# 日志logging_collector = onlog_statement = 'none'        # 不记录所有SQL,避免日志过大log_duration = offlog_min_duration_statement = 2000 # 记录执行超过2秒的语句(慢查询日志)

3.3 用户权限管理与网络访问控制

遵循“最小权限原则”是数据库安全的核心。

  • 3.3.1 创建专用应用用户

    • 绝对禁止在Web应用中直接使用数据库的rootpostgres超级用户。

    • MySQL 示例

      sql

      复制下载

      -- 创建一个名为 `app_user` 的用户,并设置密码CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'a-strong-application-password';-- 授予用户对 `app_db` 数据库的所有权限(可根据需要细化权限,如SELECT, INSERT, UPDATE)GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';-- 使权限生效FLUSH PRIVILEGES;
    • PostgreSQL 示例

      sql

      复制下载

      -- 创建一个名为 `app_user` 的用户CREATE USER app_user WITH PASSWORD 'a-strong-application-password';-- 创建一个数据库CREATE DATABASE app_db;-- 将数据库的所有权限授予该用户GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user;
  • 3.3.2 谨慎配置远程访问

    • 在配置文件中将 bind-address (MySQL) 或 listen_addresses (PostgreSQL) 设置为服务器IP。

    • 在防火墙(如UFW/firewalld)中严格限制访问源IP,例如只允许你的办公网络IP或特定的应用服务器IP访问数据库的3306/5432端口。

    • 在数据库权限系统中,将用户从 'user'@'localhost' 修改为 'user'@'specific_app_server_ip',进一步缩小范围。

    • 安全第一:如无绝对必要,应将数据库服务绑定在 127.0.0.1(localhost),禁止任何远程访问。

    • 如需远程管理

    1. 通过SSH隧道连接,这是最安全的方式。

    2. 如必须开放,则:


3.4 基础备份与恢复策略

“无备份,不上线”。备份是数据安全的最后一道防线。

  • 3.4.1 MySQL 逻辑备份与恢复

    • 使用 mysqldump 工具

      bash

      复制下载

      # 完整备份单个数据库mysqldump -u root -p app_db > app_db_backup_$(date +%Y%m%d).sql# 恢复数据库mysql -u root -p app_db < app_db_backup_20231027.sql
  • 3.4.2 PostgreSQL 逻辑备份与恢复

    • 使用 pg_dump 和 pg_restore 工具

      bash

      复制下载

      # 备份数据库,并以自定义格式存储(支持并行恢复)sudo -u postgres pg_dump -Fc app_db > app_db_backup_$(date +%Y%m%d).dump# 恢复数据库sudo -u postgres pg_restore -d app_db app_db_backup_20231027.dump
  • 3.4.3 制定备份策略

    • 频率:根据数据变更频率,制定每日或每周全量备份。

    • 存储:备份文件必须异地存储,与生产服务器分离。

    • 验证定期进行恢复演练,确保备份文件是有效且可用的。

本章总结

通过本章的学习,你已经超越了简单地“安装一个数据库”。你完成了从安装、安全初始化、核心配置调优到用户权限管理和备份策略制定的完整闭环。你现在拥有的不再是一个充满安全隐患的默认数据库,而是一个经过加固、配置清晰、权限受控、并拥有基本灾难恢复能力的可靠数据服务。

记住,这里的配置是基础性的。在本书后续的性能篇扩展篇中,我们将基于这个稳固的基石,深入探讨数据库的高级性能调优、读写分离、分库分表等高阶主题,以应对更严峻的挑战。


[升级VIP更划算]
当他人从你分享的链接访问本页面时,每一个访问者的点击,你将获得[1经验] 的奖励,一个IP计算一次.
上一章

热门书评

返回顶部