活动公告

系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

CentOS服务器环境下数据库部署的详细方法与实用技巧 从准备工作到安装配置再到安全设置和性能优化的问题解决方案

SunJu_FaceMall

3万

主题

2720

科技点

3万

积分

执行版主

碾压王

积分
32881

塔罗立华奏

执行版主 发表于 2025-8-28 13:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在当今数据驱动的时代,数据库作为信息存储和管理的核心组件,其部署和管理显得尤为重要。CentOS作为企业级Linux发行版,以其稳定性和安全性成为众多服务器系统的首选。本文将详细介绍在CentOS服务器环境下部署数据库的全过程,从准备工作到安装配置,再到安全设置和性能优化,并提供一系列实用技巧和问题解决方案,帮助读者顺利完成数据库部署工作。

一、准备工作

1. 系统要求确认

在开始数据库部署前,首先需要确认系统是否满足数据库运行的最低要求:
  1. # 检查CentOS版本
  2. cat /etc/centos-release
  3. # 检查系统内核版本
  4. uname -r
  5. # 检查系统架构
  6. uname -m
  7. # 检查内存大小
  8. free -h
  9. # 检查磁盘空间
  10. df -h
复制代码

2. 系统更新与基础软件安装

确保系统是最新的,并安装必要的软件包:
  1. # 更新系统
  2. sudo yum update -y
  3. # 安装基础工具包
  4. sudo yum install -y wget vim curl net-tools epel-release
  5. # 安装开发工具包(编译安装时需要)
  6. sudo yum groupinstall -y "Development Tools"
复制代码

3. 创建专用用户和组

为数据库服务创建专用用户和组,提高安全性:
  1. # 创建mysql用户组(以MySQL为例)
  2. sudo groupadd mysql
  3. # 创建mysql用户并添加到mysql组
  4. sudo useradd -r -g mysql -s /bin/false mysql
复制代码

4. 配置防火墙和SELinux

根据需要配置防火墙和SELinux:
  1. # 检查防火墙状态
  2. sudo firewall-cmd --state
  3. # 开放数据库端口(以MySQL默认端口3306为例)
  4. sudo firewall-cmd --permanent --add-port=3306/tcp
  5. sudo firewall-cmd --reload
  6. # 检查SELinux状态
  7. sestatus
  8. # 临时关闭SELinux(不推荐生产环境使用)
  9. sudo setenforce 0
  10. # 永久关闭SELinux(需要重启)
  11. sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
复制代码

5. 创建数据目录

为数据库创建专用数据目录,并设置适当的权限:
  1. # 创建数据目录
  2. sudo mkdir -p /data/mysql
  3. # 设置目录所有者
  4. sudo chown -R mysql:mysql /data/mysql
  5. # 设置目录权限
  6. sudo chmod -R 750 /data/mysql
复制代码

二、数据库选择与安装

1. MySQL/MariaDB安装
  1. # 安装MariaDB(CentOS 7默认)
  2. sudo yum install -y mariadb-server mariadb
  3. # 或者安装MySQL
  4. # 首先添加MySQL官方仓库
  5. sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  6. # 安装MySQL服务器
  7. sudo yum install -y mysql-community-server
复制代码

如果需要特定版本或定制配置,可以选择源码编译安装:
  1. # 下载MySQL源码
  2. wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28.tar.gz
  3. # 解压
  4. tar -zxvf mysql-8.0.28.tar.gz
  5. cd mysql-8.0.28
  6. # 创建编译目录
  7. mkdir build && cd build
  8. # 配置编译选项
  9. cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  10. -DMYSQL_DATADIR=/data/mysql \
  11. -DSYSCONFDIR=/etc \
  12. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  13. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
  14. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  15. -DWITH_READLINE=1 \
  16. -DWITH_SSL=system \
  17. -DWITH_ZLIB=system \
  18. -DWITH_LIBWRAP=0 \
  19. -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
  20. -DDEFAULT_CHARSET=utf8mb4 \
  21. -DDEFAULT_COLLATION=utf8mb4_general_ci \
  22. -DENABLED_LOCAL_INFILE=1 \
  23. -DWITH_PARTITION_STORAGE_ENGINE=1 \
  24. -DMYSQL_USER=mysql
  25. # 编译并安装
  26. make && sudo make install
复制代码

2. PostgreSQL安装
  1. # 安装PostgreSQL
  2. sudo yum install -y postgresql-server postgresql-contrib
  3. # 或者使用PostgreSQL官方仓库
  4. sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
  5. # 安装PostgreSQL 12(以12版本为例)
  6. sudo yum install -y postgresql12-server postgresql12-contrib
复制代码

3. MongoDB安装
  1. # 创建MongoDB仓库文件
  2. sudo tee /etc/yum.repos.d/mongodb-org.repo << EOF
  3. [mongodb-org-4.4]
  4. name=MongoDB Repository
  5. baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/4.4/x86_64/
  6. gpgcheck=1
  7. enabled=1
  8. gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
  9. EOF
  10. # 安装MongoDB
  11. sudo yum install -y mongodb-org
复制代码

三、基本配置

1. MySQL/MariaDB初始化配置
  1. # 初始化MySQL数据目录
  2. sudo mysqld --initialize --user=mysql --datadir=/data/mysql
  3. # 记录生成的临时root密码
  4. # 启动MySQL服务
  5. sudo systemctl start mysqld
  6. sudo systemctl enable mysqld
  7. # 安全初始化脚本
  8. sudo mysql_secure_installation
复制代码

编辑MySQL配置文件/etc/my.cnf或/etc/mysql/my.cnf:
  1. [mysqld]
  2. # 基本设置
  3. port = 3306
  4. socket = /tmp/mysql.sock
  5. pid-file = /var/run/mysqld/mysqld.pid
  6. datadir = /data/mysql
  7. # 字符集设置
  8. character-set-server = utf8mb4
  9. collation-server = utf8mb4_unicode_ci
  10. init-connect = 'SET NAMES utf8mb4'
  11. # 连接设置
  12. max_connections = 500
  13. max_connect_errors = 100000
  14. back_log = 512
  15. max_allowed_packet = 64M
  16. interactive_timeout = 28800
  17. wait_timeout = 28800
  18. # InnoDB设置
  19. innodb_buffer_pool_size = 4G  # 根据服务器内存调整,通常为系统内存的50%-70%
  20. innodb_log_file_size = 1G
  21. innodb_log_buffer_size = 64M
  22. innodb_flush_log_at_trx_commit = 2
  23. innodb_lock_wait_timeout = 50
  24. innodb_file_per_table = 1
  25. # 日志设置
  26. slow_query_log = 1
  27. slow_query_log_file = /var/log/mysql/slow.log
  28. long_query_time = 2
  29. log_queries_not_using_indexes = 1
  30. # 其他设置
  31. expire_logs_days = 7
  32. max_binlog_size = 1G
复制代码

2. PostgreSQL初始化配置
  1. # 初始化数据库集群
  2. sudo postgresql-setup initdb
  3. # 启动PostgreSQL服务
  4. sudo systemctl start postgresql
  5. sudo systemctl enable postgresql
复制代码

编辑PostgreSQL配置文件/var/lib/pgsql/12/data/postgresql.conf:
  1. # 连接设置
  2. listen_addresses = '*'  # 根据安全需求调整
  3. port = 5432
  4. max_connections = 100
  5. # 内存设置
  6. shared_buffers = 1GB  # 通常为系统内存的25%
  7. effective_cache_size = 3GB  # 通常为系统内存的50%-75%
  8. work_mem = 16MB
  9. maintenance_work_mem = 256MB
  10. # 日志设置
  11. logging_collector = on
  12. log_directory = 'pg_log'
  13. log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
  14. log_statement = 'all'
  15. log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '
  16. # 查询优化
  17. random_page_cost = 1.1  # SSD使用此值
  18. effective_io_concurrency = 200  # SSD使用此值
复制代码

编辑客户端认证配置文件/var/lib/pgsql/12/data/pg_hba.conf:
  1. # 允许本地所有用户使用md5密码认证连接所有数据库
  2. local   all             all                                     md5
  3. # 允许IP地址为192.168.1.0/24的所有主机使用md5密码认证连接所有数据库
  4. host    all             all             192.168.1.0/24          md5
复制代码

3. MongoDB初始化配置
  1. # 创建数据目录和日志目录
  2. sudo mkdir -p /data/mongodb
  3. sudo mkdir -p /var/log/mongodb
  4. sudo chown -R mongod:mongod /data/mongodb /var/log/mongodb
  5. # 启动MongoDB服务
  6. sudo systemctl start mongod
  7. sudo systemctl enable mongod
复制代码

编辑MongoDB配置文件/etc/mongod.conf:
  1. storage:
  2.   dbPath: /data/mongodb
  3.   journal:
  4.     enabled: true
  5.   wiredTiger:
  6.     engineConfig:
  7.       cacheSizeGB: 2  # 根据服务器内存调整,通常为系统内存的50%
  8. systemLog:
  9.   destination: file
  10.   logAppend: true
  11.   path: /var/log/mongodb/mongod.log
  12. net:
  13.   port: 27017
  14.   bindIp: 0.0.0.0  # 根据安全需求调整
  15. security:
  16.   authorization: enabled
  17. operationProfiling:
  18.   slowOpThresholdMs: 100
  19.   mode: slowOp
  20. replication:
  21.   replSetName: rs0  # 如果使用副本集
复制代码

四、安全设置

1. 用户和权限管理
  1. -- 登录MySQL
  2. mysql -u root -p
  3. -- 创建数据库
  4. CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. -- 创建用户并设置密码
  6. CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'strong_password';
  7. CREATE USER 'myuser'@'%' IDENTIFIED BY 'strong_password';
  8. -- 授予用户权限
  9. GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
  10. GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'myuser'@'%';
  11. -- 刷新权限
  12. FLUSH PRIVILEGES;
  13. -- 查看用户权限
  14. SHOW GRANTS FOR 'myuser'@'localhost';
  15. -- 撤销权限
  16. REVOKE DELETE ON mydb.* FROM 'myuser'@'%';
  17. -- 删除用户
  18. DROP USER 'myuser'@'%';
复制代码
  1. # 切换到postgres用户
  2. sudo -u postgres psql
  3. # 创建数据库
  4. CREATE DATABASE mydb;
  5. # 创建用户
  6. CREATE USER myuser WITH PASSWORD 'strong_password';
  7. # 授予用户数据库权限
  8. GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
  9. # 授予用户模式权限
  10. \c mydb
  11. GRANT ALL ON SCHEMA public TO myuser;
  12. # 查看用户权限
  13. \du myuser
  14. # 撤销权限
  15. REVOKE ALL ON DATABASE mydb FROM myuser;
  16. # 删除用户
  17. DROP USER myuser;
复制代码
  1. // 连接到MongoDB
  2. mongo
  3. // 切换到admin数据库
  4. use admin
  5. // 创建管理员用户
  6. db.createUser({
  7.   user: "admin",
  8.   pwd: "strong_password",
  9.   roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
  10. })
  11. // 认证管理员
  12. db.auth("admin", "strong_password")
  13. // 创建普通数据库用户
  14. use mydb
  15. db.createUser({
  16.   user: "myuser",
  17.   pwd: "strong_password",
  18.   roles: [{ role: "readWrite", db: "mydb" }]
  19. })
  20. // 查看用户
  21. use mydb
  22. show users
  23. // 删除用户
  24. db.dropUser("myuser")
复制代码

2. SSL/TLS加密配置
  1. # 创建SSL证书目录
  2. sudo mkdir -p /etc/mysql/ssl
  3. cd /etc/mysql/ssl
  4. # 生成CA证书
  5. sudo openssl genrsa 2048 > ca-key.pem
  6. sudo openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem
  7. # 生成服务器证书
  8. sudo openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem
  9. sudo openssl rsa -in server-key.pem -out server-key.pem
  10. sudo openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
  11. # 生成客户端证书
  12. sudo openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem
  13. sudo openssl rsa -in client-key.pem -out client-key.pem
  14. sudo openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
  15. # 设置权限
  16. sudo chown -R mysql:mysql /etc/mysql/ssl
  17. sudo chmod 600 /etc/mysql/ssl/*.pem
复制代码

编辑MySQL配置文件/etc/my.cnf,添加SSL配置:
  1. [mysqld]
  2. ssl-ca = /etc/mysql/ssl/ca.pem
  3. ssl-cert = /etc/mysql/ssl/server-cert.pem
  4. ssl-key = /etc/mysql/ssl/server-key.pem
复制代码

重启MySQL服务:
  1. sudo systemctl restart mysqld
复制代码

验证SSL是否启用:
  1. SHOW VARIABLES LIKE '%ssl%';
复制代码
  1. # 创建SSL证书目录
  2. sudo mkdir -p /var/lib/pgsql/12/data/ssl
  3. cd /var/lib/pgsql/12/data/ssl
  4. # 生成服务器证书
  5. sudo openssl req -new -x509 -days 3650 -nodes -text -out server.crt -keyout server.key -subj "/CN=postgres"
  6. sudo chmod og-rwx server.key
  7. # 编辑PostgreSQL配置文件
  8. sudo vi /var/lib/pgsql/12/data/postgresql.conf
复制代码

添加以下配置:
  1. ssl = on
  2. ssl_cert_file = 'ssl/server.crt'
  3. ssl_key_file = 'ssl/server.key'
复制代码

重启PostgreSQL服务:
  1. sudo systemctl restart postgresql-12
复制代码
  1. # 创建SSL证书目录
  2. sudo mkdir -p /etc/mongodb/ssl
  3. cd /etc/mongodb/ssl
  4. # 生成CA证书
  5. sudo openssl genrsa -out ca.key 2048
  6. sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=MongoDB CA"
  7. # 生成服务器证书
  8. sudo openssl genrsa -out server.key 2048
  9. sudo openssl req -new -key server.key -out server.csr -subj "/CN=mongodb.example.com"
  10. sudo openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
  11. # 生成客户端证书
  12. sudo openssl genrsa -out client.key 2048
  13. sudo openssl req -new -key client.key -out client.csr -subj "/CN=MongoDB Client"
  14. sudo openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
  15. # 合并证书和私钥
  16. sudo cat client.key client.crt > client.pem
  17. sudo cat server.key server.crt > server.pem
  18. # 设置权限
  19. sudo chown -R mongod:mongod /etc/mongodb/ssl
  20. sudo chmod 600 /etc/mongodb/ssl/*.pem
复制代码

编辑MongoDB配置文件/etc/mongod.conf,添加SSL配置:
  1. net:
  2.   ssl:
  3.     mode: requireSSL
  4.     PEMKeyFile: /etc/mongodb/ssl/server.pem
  5.     CAFile: /etc/mongodb/ssl/ca.crt
复制代码

重启MongoDB服务:
  1. sudo systemctl restart mongod
复制代码

3. 防火墙与访问控制
  1. # 安装iptables
  2. sudo yum install -y iptables-services
  3. # 停止firewalld
  4. sudo systemctl stop firewalld
  5. sudo systemctl mask firewalld
  6. # 启动iptables
  7. sudo systemctl enable iptables
  8. sudo systemctl start iptables
  9. # 允许本地回环
  10. sudo iptables -A INPUT -i lo -j ACCEPT
  11. # 允许已建立的连接
  12. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  13. # 允许SSH连接
  14. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  15. # 允许特定IP访问MySQL端口
  16. sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
  17. # 允许特定IP访问PostgreSQL端口
  18. sudo iptables -A INPUT -p tcp --dport 5432 -s 192.168.1.0/24 -j ACCEPT
  19. # 允许特定IP访问MongoDB端口
  20. sudo iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
  21. # 拒绝所有其他输入
  22. sudo iptables -A INPUT -j DROP
  23. # 保存规则
  24. sudo service iptables save
复制代码

编辑/etc/hosts.allow文件:
  1. # 允许特定IP访问MySQL
  2. mysqld: 192.168.1.0/24
  3. # 允许特定IP访问PostgreSQL
  4. postgresql: 192.168.1.0/24
  5. # 允许特定IP访问MongoDB
  6. mongod: 192.168.1.0/24
复制代码

编辑/etc/hosts.deny文件:
  1. # 拒绝所有其他访问
  2. mysqld: ALL
  3. postgresql: ALL
  4. mongod: ALL
复制代码

五、性能优化

1. MySQL/MariaDB性能优化

编辑MySQL配置文件/etc/my.cnf,根据服务器硬件配置调整以下参数:
  1. [mysqld]
  2. # InnoDB缓冲池大小,通常为系统内存的50%-70%
  3. innodb_buffer_pool_size = 8G
  4. # InnoDB日志文件大小,通常为缓冲池大小的25%
  5. innodb_log_file_size = 2G
  6. # InnoDB刷新策略,1为完全ACID,2为性能优先
  7. innodb_flush_log_at_trx_commit = 2
  8. # InnoDB IO能力,SSD可设置为10000,普通硬盘可设置为200
  9. innodb_io_capacity = 2000
  10. # 查询缓存,MySQL 8.0已移除,仅适用于MySQL 5.7及以下版本
  11. query_cache_type = 1
  12. query_cache_size = 128M
  13. query_cache_limit = 2M
  14. # 表定义缓存
  15. table_definition_cache = 2000
  16. table_open_cache = 2000
  17. # 临时表
  18. tmp_table_size = 256M
  19. max_heap_table_size = 256M
  20. # 线程缓存
  21. thread_cache_size = 16
  22. # 连接超时
  23. wait_timeout = 300
  24. interactive_timeout = 300
  25. # 慢查询日志
  26. slow_query_log = 1
  27. slow_query_log_file = /var/log/mysql/slow.log
  28. long_query_time = 2
  29. log_queries_not_using_indexes = 1
复制代码
  1. -- 分析表使用情况
  2. SELECT table_schema, table_name, index_name
  3. FROM information_schema.statistics
  4. WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema');
  5. -- 查看索引使用情况
  6. SELECT object_schema, object_name, index_name
  7. FROM performance_schema.table_io_waits_summary_by_index_usage
  8. WHERE index_name IS NOT NULL
  9. AND count_star > 0
  10. ORDER BY count_star DESC;
  11. -- 查看未使用的索引
  12. SELECT object_schema, object_name, index_name
  13. FROM performance_schema.table_io_waits_summary_by_index_usage
  14. WHERE index_name IS NOT NULL
  15. AND count_star = 0
  16. AND object_schema NOT IN ('mysql', 'information_schema', 'performance_schema')
  17. ORDER BY object_schema, object_name;
  18. -- 创建索引
  19. CREATE INDEX idx_name ON table_name(column_name);
  20. -- 创建复合索引
  21. CREATE INDEX idx_name ON table_name(column1, column2);
  22. -- 删除索引
  23. DROP INDEX idx_name ON table_name;
复制代码
  1. -- 使用EXPLAIN分析查询执行计划
  2. EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
  3. -- 使用EXPLAIN FORMAT=JSON获取更详细的执行计划
  4. EXPLAIN FORMAT=JSON SELECT * FROM table_name WHERE column_name = 'value';
  5. -- 使用EXPLAIN ANALYZE(MySQL 8.0+)获取实际执行时间和行数
  6. EXPLAIN ANALYZE SELECT * FROM table_name WHERE column_name = 'value';
  7. -- 使用SHOW PROFILE分析查询性能
  8. SET profiling = 1;
  9. SELECT * FROM table_name WHERE column_name = 'value';
  10. SHOW PROFILE;
  11. SHOW PROFILE FOR QUERY 1;
复制代码

2. PostgreSQL性能优化

编辑PostgreSQL配置文件/var/lib/pgsql/12/data/postgresql.conf,根据服务器硬件配置调整以下参数:
  1. # 连接设置
  2. max_connections = 200
  3. # 内存设置
  4. shared_buffers = 4GB  # 通常为系统内存的25%
  5. effective_cache_size = 12GB  # 通常为系统内存的50%-75%
  6. work_mem = 32MB  # 排序操作使用的内存
  7. maintenance_work_mem = 512MB  # 维护操作使用的内存
  8. # 检查点设置
  9. checkpoint_completion_target = 0.9  # 检查点完成目标
  10. checkpoint_timeout = 15min  # 检查点超时时间
  11. max_wal_size = 4GB  # WAL最大大小
  12. min_wal_size = 1GB  # WAL最小大小
  13. # 查询优化
  14. random_page_cost = 1.1  # SSD使用此值
  15. effective_io_concurrency = 200  # SSD使用此值
  16. seq_page_cost = 1  # 顺序扫描成本
  17. # 日志设置
  18. log_min_duration_statement = 1000  # 记录执行时间超过1秒的查询
  19. log_checkpoints = on  # 记录检查点
  20. log_connections = on  # 记录连接
  21. log_disconnections = on  # 记录断开连接
  22. # 统计信息收集
  23. track_activities = on
  24. track_counts = on
  25. track_io_timing = on
复制代码
  1. -- 分析表
  2. ANALYZE table_name;
  3. -- 查看表大小
  4. SELECT pg_size_pretty(pg_total_relation_size('table_name'));
  5. -- 查看索引大小
  6. SELECT pg_size_pretty(pg_relation_size('index_name'));
  7. -- 创建B-tree索引
  8. CREATE INDEX idx_name ON table_name(column_name);
  9. -- 创建复合索引
  10. CREATE INDEX idx_name ON table_name(column1, column2);
  11. -- 创建部分索引
  12. CREATE INDEX idx_name ON table_name(column_name) WHERE condition;
  13. -- 创建哈希索引
  14. CREATE INDEX idx_name ON table_name USING hash(column_name);
  15. -- 删除索引
  16. DROP INDEX idx_name;
  17. -- 重建索引
  18. REINDEX INDEX idx_name;
  19. REINDEX TABLE table_name;
复制代码
  1. -- 使用EXPLAIN分析查询执行计划
  2. EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
  3. -- 使用EXPLAIN ANALYZE获取实际执行时间和行数
  4. EXPLAIN ANALYZE SELECT * FROM table_name WHERE column_name = 'value';
  5. -- 使用EXPLAIN (ANALYZE, BUFFERS)获取缓冲区使用情况
  6. EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM table_name WHERE column_name = 'value';
  7. -- 使用EXPLAIN (ANALYZE, VERBOSE)获取更详细的执行计划
  8. EXPLAIN (ANALYZE, VERBOSE) SELECT * FROM table_name WHERE column_name = 'value';
复制代码

3. MongoDB性能优化

编辑MongoDB配置文件/etc/mongod.conf,根据服务器硬件配置调整以下参数:
  1. storage:
  2.   dbPath: /data/mongodb
  3.   journal:
  4.     enabled: true
  5.   wiredTiger:
  6.     engineConfig:
  7.       cacheSizeGB: 8  # 根据服务器内存调整,通常为系统内存的50%
  8.       journalCompressor: snappy
  9.     collectionConfig:
  10.       blockCompressor: snappy
  11.     indexConfig:
  12.       prefixCompression: true
  13. operationProfiling:
  14.   slowOpThresholdMs: 100
  15.   mode: slowOp
  16. replication:
  17.   oplogSizeMB: 2048  # 副本集操作日志大小
  18. net:
  19.   port: 27017
  20.   bindIp: 0.0.0.0
  21.   maxIncomingConnections: 10000
  22. security:
  23.   authorization: enabled
  24. setParameter:
  25.   internalQueryExecMaxBlockingSortBytes: 104857600
  26.   internalQueryExecYieldIterations: 1000000
复制代码
  1. // 连接到MongoDB
  2. mongo
  3. // 切换到数据库
  4. use mydb
  5. // 创建单字段索引
  6. db.collection.createIndex({ field: 1 })
  7. // 创建复合索引
  8. db.collection.createIndex({ field1: 1, field2: -1 })
  9. // 创建唯一索引
  10. db.collection.createIndex({ field: 1 }, { unique: true })
  11. // 创建部分索引
  12. db.collection.createIndex({ field: 1 }, { partialFilterExpression: { field: { $exists: true } } })
  13. // 创建文本索引
  14. db.collection.createIndex({ field: "text" })
  15. // 查看索引
  16. db.collection.getIndexes()
  17. // 查看索引使用情况
  18. db.collection.aggregate([ { $indexStats: {} } ])
  19. // 删除索引
  20. db.collection.dropIndex({ field: 1 })
复制代码
  1. // 使用explain()分析查询执行计划
  2. db.collection.find({ field: "value" }).explain()
  3. // 使用explain("executionStats")获取执行统计信息
  4. db.collection.find({ field: "value" }).explain("executionStats")
  5. // 使用explain("allPlansExecution")获取所有执行计划
  6. db.collection.find({ field: "value" }).explain("allPlansExecution")
  7. // 使用hint()强制使用特定索引
  8. db.collection.find({ field: "value" }).hint({ field: 1 })
  9. // 使用count()优化计数
  10. db.collection.count({ field: "value" })
  11. // 使用limit()限制返回结果数量
  12. db.collection.find({ field: "value" }).limit(10)
  13. // 使用skip()跳过指定数量的结果
  14. db.collection.find({ field: "value" }).skip(10).limit(10)
  15. // 使用sort()进行排序
  16. db.collection.find({ field: "value" }).sort({ other_field: 1 })
复制代码

六、备份与恢复

1. MySQL/MariaDB备份与恢复
  1. # 备份所有数据库
  2. mysqldump -u root -p --all-databases --single-transaction --routines --triggers --events > all_databases.sql
  3. # 备份指定数据库
  4. mysqldump -u root -p --single-transaction --routines --triggers mydb > mydb.sql
  5. # 备份指定表
  6. mysqldump -u root -p mydb table1 table2 > tables.sql
  7. # 压缩备份
  8. mysqldump -u root -p mydb | gzip > mydb.sql.gz
  9. # 恢复数据库
  10. mysql -u root -p mydb < mydb.sql
  11. # 恢复压缩的备份
  12. gunzip < mydb.sql.gz | mysql -u root -p mydb
复制代码
  1. # 使用XtraBackup进行物理备份
  2. # 安装XtraBackup
  3. sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
  4. sudo yum install -y percona-xtrabackup-24
  5. # 创建完整备份
  6. sudo innobackupex --user=root --password=your_password /data/backups
  7. # 准备备份
  8. sudo innobackupex --apply-log /data/backups/2021-01-01_12-00-00
  9. # 恢复备份
  10. sudo systemctl stop mysqld
  11. sudo mv /data/mysql /data/mysql.bak
  12. sudo mkdir -p /data/mysql
  13. sudo innobackupex --copy-back /data/backups/2021-01-01_12-00-00
  14. sudo chown -R mysql:mysql /data/mysql
  15. sudo systemctl start mysqld
复制代码
  1. # 创建完整备份
  2. sudo innobackupex --user=root --password=your_password /data/backups
  3. # 创建增量备份
  4. sudo innobackupex --user=root --password=your_password --incremental /data/backups --incremental-basedir=/data/backups/2021-01-01_12-00-00
  5. # 准备完整备份
  6. sudo innobackupex --apply-log --redo-only /data/backups/2021-01-01_12-00-00
  7. # 应用增量备份
  8. sudo innobackupex --apply-log --redo-only /data/backups/2021-01-01_12-00-00 --incremental-dir=/data/backups/2021-01-02_12-00-00
  9. # 恢复备份
  10. sudo systemctl stop mysqld
  11. sudo mv /data/mysql /data/mysql.bak
  12. sudo mkdir -p /data/mysql
  13. sudo innobackupex --copy-back /data/backups/2021-01-01_12-00-00
  14. sudo chown -R mysql:mysql /data/mysql
  15. sudo systemctl start mysqld
复制代码

2. PostgreSQL备份与恢复
  1. # 备份所有数据库
  2. pg_dumpall -U postgres -f all_databases.sql
  3. # 备份指定数据库
  4. pg_dump -U postgres -f mydb.sql mydb
  5. # 备份指定数据库并压缩
  6. pg_dump -U postgres mydb | gzip > mydb.sql.gz
  7. # 备份指定表
  8. pg_dump -U postgres -t table1 -t table2 -f tables.sql mydb
  9. # 恢复数据库
  10. psql -U postgres -f mydb.sql
  11. # 恢复压缩的备份
  12. gunzip -c mydb.sql.gz | psql -U postgres
  13. # 恢复所有数据库
  14. psql -U postgres -f all_databases.sql
复制代码
  1. # 使用pg_basebackup进行物理备份
  2. # 配置PostgreSQL允许复制
  3. echo "host replication all 192.168.1.0/24 md5" | sudo tee -a /var/lib/pgsql/12/data/pg_hba.conf
  4. sudo systemctl restart postgresql-12
  5. # 创建物理备份
  6. pg_basebackup -U postgres -h localhost -D /data/backups/pg_backup -Ft -z -P
  7. # 恢复备份
  8. sudo systemctl stop postgresql-12
  9. sudo mv /var/lib/pgsql/12/data /var/lib/pgsql/12/data.bak
  10. sudo mkdir -p /var/lib/pgsql/12/data
  11. sudo tar -xzf /data/backups/pg_backup/base.tar.gz -C /var/lib/pgsql/12/data
  12. sudo chown -R postgres:postgres /var/lib/pgsql/12/data
  13. # 创建recovery.conf文件
  14. echo "standby_mode = 'on'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
  15. echo "primary_conninfo = 'host=localhost port=5432 user=postgres'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
  16. sudo systemctl start postgresql-12
复制代码
  1. # 配置归档
  2. sudo vi /var/lib/pgsql/12/data/postgresql.conf
复制代码

添加以下配置:
  1. wal_level = replica
  2. archive_mode = on
  3. archive_command = 'test ! -f /data/backups/wal/%f && cp %p /data/backups/wal/%f'
  4. max_wal_senders = 3
复制代码

重启PostgreSQL服务:
  1. sudo systemctl restart postgresql-12
复制代码

创建基础备份:
  1. pg_basebackup -U postgres -h localhost -D /data/backups/pg_backup -Ft -z -P -Xs
复制代码

恢复备份:
  1. sudo systemctl stop postgresql-12
  2. sudo mv /var/lib/pgsql/12/data /var/lib/pgsql/12/data.bak
  3. sudo mkdir -p /var/lib/pgsql/12/data
  4. sudo tar -xzf /data/backups/pg_backup/base.tar.gz -C /var/lib/pgsql/12/data
  5. sudo chown -R postgres:postgres /var/lib/pgsql/12/data
  6. # 创建recovery.conf文件
  7. echo "restore_command = 'cp /data/backups/wal/%f %p'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
  8. echo "recovery_target_time = '2021-01-01 12:00:00'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
  9. sudo systemctl start postgresql-12
复制代码

3. MongoDB备份与恢复
  1. # 备份所有数据库
  2. mongodump --username admin --password your_password --authenticationDatabase admin --out /data/backups/mongo_backup
  3. # 备份指定数据库
  4. mongodump --username admin --password your_password --authenticationDatabase admin --db mydb --out /data/backups/mydb_backup
  5. # 备份指定集合
  6. mongodump --username admin --password your_password --authenticationDatabase admin --db mydb --collection mycollection --out /data/backups/collection_backup
  7. # 恢复所有数据库
  8. mongorestore --username admin --password your_password --authenticationDatabase admin /data/backups/mongo_backup
  9. # 恢复指定数据库
  10. mongorestore --username admin --password your_password --authenticationDatabase admin --db mydb /data/backups/mydb_backup/mydb
  11. # 恢复指定集合
  12. mongorestore --username admin --password your_password --authenticationDatabase admin --db mydb --collection mycollection /data/backups/collection_backup/mydb/mycollection.bson
复制代码
  1. # 创建文件系统快照(需要LVM支持)
  2. # 创建快照
  3. sudo lvcreate --size 1G --snapshot --name mongo_snap /dev/vg0/mongo_data
  4. # 挂载快照
  5. sudo mkdir -p /mnt/mongo_snap
  6. sudo mount /dev/vg0/mongo_snap /mnt/mongo_snap
  7. # 复制数据
  8. sudo cp -r /mnt/mongo_snap /data/backups/mongo_fs_backup
  9. # 卸载并删除快照
  10. sudo umount /mnt/mongo_snap
  11. sudo lvremove -f /dev/vg0/mongo_snap
复制代码
  1. # 在副本集的辅助节点上创建备份
  2. mongodump --host secondary.example.com --port 27017 --username admin --password your_password --authenticationDatabase admin --out /data/backups/mongo_backup
  3. # 使用oplog进行时间点恢复
  4. mongodump --host secondary.example.com --port 27017 --username admin --password your_password --authenticationDatabase admin --oplog --out /data/backups/mongo_backup
复制代码

七、监控与维护

1. MySQL/MariaDB监控与维护
  1. -- 查看服务器状态
  2. SHOW STATUS;
  3. SHOW VARIABLES;
  4. -- 查看进程列表
  5. SHOW PROCESSLIST;
  6. SHOW FULL PROCESSLIST;
  7. -- 查看InnoDB状态
  8. SHOW ENGINE INNODB STATUS;
  9. -- 查看查询执行统计
  10. SELECT * FROM performance_schema.events_statements_summary_by_digest
  11. ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
  12. -- 查看表锁争用
  13. SELECT * FROM performance_schema.table_lock_waits_summary_by_table
  14. WHERE COUNT_STAR > 0
  15. ORDER BY SUM_TIMER_WAIT DESC;
  16. -- 查看索引使用情况
  17. SELECT * FROM performance_schema.table_io_waits_summary_by_index_usage
  18. WHERE index_name IS NOT NULL
  19. ORDER BY COUNT_STAR DESC;
  20. -- 查看表IO统计
  21. SELECT * FROM performance_schema.table_io_waits_summary_by_table
  22. ORDER BY SUM_TIMER_WAIT DESC;
复制代码
  1. -- 分析表
  2. ANALYZE TABLE table_name;
  3. -- 优化表
  4. OPTIMIZE TABLE table_name;
  5. -- 检查表
  6. CHECK TABLE table_name;
  7. -- 修复表
  8. REPAIR TABLE table_name;
  9. -- 清理二进制日志
  10. PURGE BINARY LOGS TO 'mysql-bin.000100';
  11. PURGE BINARY LOGS BEFORE '2021-01-01 12:00:00';
  12. -- 刷新表
  13. FLUSH TABLES;
  14. -- 刷新权限
  15. FLUSH PRIVILEGES;
  16. -- 刷新日志
  17. FLUSH LOGS;
  18. -- 重置查询缓存
  19. RESET QUERY CACHE;
复制代码
  1. # 安装Percona Monitoring and Management (PMM)
  2. # 安装Docker
  3. sudo yum install -y docker
  4. sudo systemctl start docker
  5. sudo systemctl enable docker
  6. # 安装PMM服务器
  7. docker run -d \
  8.   -p 80:80 \
  9.   -p 443:443 \
  10.   --name pmm-server \
  11.   -v /opt/prometheus/data \
  12.   -v /opt/consul-data \
  13.   -v /var/lib/mysql \
  14.   -v /var/lib/grafana \
  15.   --restart always \
  16.   percona/pmm-server:latest
  17. # 安装PMM客户端
  18. sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
  19. sudo yum install -y pmm2-client
  20. # 配置PMM客户端
  21. pmm-admin config --server-insecure-tls --server-url=https://admin:admin@pmm-server-ip --force
  22. # 添加MySQL监控
  23. pmm-admin add mysql --username=root --password=your_password
复制代码

2. PostgreSQL监控与维护
  1. -- 查看服务器状态
  2. SELECT * FROM pg_stat_activity;
  3. SELECT * FROM pg_stat_database;
  4. SELECT * FROM pg_stat_user_tables;
  5. SELECT * FROM pg_stat_user_indexes;
  6. -- 查看表大小
  7. SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
  8. FROM pg_tables
  9. WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
  10. ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
  11. -- 查看索引大小
  12. SELECT schemaname, tablename, indexname, pg_size_pretty(pg_relation_size(schemaname||'.'||indexname)) as size
  13. FROM pg_indexes
  14. WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
  15. ORDER BY pg_relation_size(schemaname||'.'||indexname) DESC;
  16. -- 查看查询执行统计
  17. SELECT query, calls, total_time, mean_time, rows
  18. FROM pg_stat_statements
  19. ORDER BY total_time DESC LIMIT 10;
  20. -- 查看表IO统计
  21. SELECT schemaname, tablename, heap_blks_read, heap_blks_hit
  22. FROM pg_statio_user_tables
  23. ORDER BY heap_blks_read DESC;
复制代码
  1. -- 分析表
  2. ANALYZE table_name;
  3. VACUUM ANALYZE table_name;
  4. -- 清理表
  5. VACUUM table_name;
  6. VACUUM FULL table_name;
  7. -- 重建表
  8. CLUSTER table_name;
  9. ALTER TABLE table_name SET TABLESPACE new_tablespace;
  10. -- 重建索引
  11. REINDEX INDEX index_name;
  12. REINDEX TABLE table_name;
  13. REINDEX DATABASE database_name;
  14. -- 清理过期事务
  15. VACUUM;
  16. -- 更新统计信息
  17. ANALYZE;
复制代码
  1. # 安装pgAdmin
  2. sudo yum install -y https://ftp.postgresql.org/pub/pgadmin/pgadmin4/yum/pgadmin4-redhat-repo-2-1.noarch.rpm
  3. sudo yum install -y pgadmin4
  4. # 配置pgAdmin
  5. sudo /usr/pgadmin4/bin/setup-web.sh
  6. # 安装PostgreSQL监控扩展
  7. CREATE EXTENSION pg_stat_statements;
  8. CREATE EXTENSION pg_buffercache;
  9. CREATE EXTENSION pg_stat_kcache;
  10. CREATE EXTENSION pg_qualstats;
复制代码

3. MongoDB监控与维护
  1. // 查看服务器状态
  2. db.serverStatus()
  3. db.stats()
  4. db.collection.stats()
  5. // 查看当前操作
  6. db.currentOp()
  7. // 查看慢查询
  8. db.collection.find({}, {"_id": 0}).sort({"$natural": -1}).limit(10).explain("executionStats")
  9. // 查看索引使用情况
  10. db.collection.aggregate([ { $indexStats: {} } ])
  11. // 查看复制状态
  12. rs.status()
  13. rs.printReplicationInfo()
  14. rs.printSlaveReplicationInfo()
  15. // 查看锁状态
  16. db.serverStatus().locks
复制代码
  1. // 分析集合
  2. db.collection.validate()
  3. // 重建索引
  4. db.collection.reIndex()
  5. // 压缩集合
  6. db.collection.runCommand("compact")
  7. // 清理碎片
  8. db.repairDatabase()
  9. // 查看并终止长时间运行的操作
  10. db.currentOp().inprog.forEach(function(op) {
  11.   if(op.secs_running > 60) {
  12.     db.killOp(op.opid);
  13.   }
  14. })
复制代码
  1. # 安装MongoDB Ops Manager
  2. # 下载Ops Manager
  3. wget https://downloads.mongodb.com/on-prem-mms/rpm/mongodb-mms-4.4.14.59960-1.x86_64.rhel7.rpm
  4. # 安装Ops Manager
  5. sudo rpm -ivh mongodb-mms-4.4.14.59960-1.x86_64.rhel7.rpm
  6. # 配置Ops Manager
  7. sudo vi /opt/mongodb/mms/conf/conf-mms.properties
  8. # 启动Ops Manager
  9. sudo systemctl start mongodb-mms
  10. # 安装MongoDB监控代理
  11. # 下载监控代理
  12. wget https://downloads.mongodb.com/on-prem-mms/agent/mongodb-mms-automation-agent-10.14.18.5996-1.x86_64.rhel7.rpm
  13. # 安装监控代理
  14. sudo rpm -ivh mongodb-mms-automation-agent-10.14.18.5996-1.x86_64.rhel7.rpm
  15. # 配置监控代理
  16. sudo vi /etc/mongodb-mms/automation-agent.config
  17. # 启动监控代理
  18. sudo systemctl start mongodb-mms-automation-agent
复制代码

八、常见问题与解决方案

1. MySQL/MariaDB常见问题与解决方案

解决方案:
  1. # 检查MySQL服务状态
  2. sudo systemctl status mysqld
  3. # 启动MySQL服务
  4. sudo systemctl start mysqld
  5. # 检查MySQL端口是否监听
  6. sudo netstat -tlnp | grep 3306
  7. # 检查防火墙设置
  8. sudo firewall-cmd --list-all
  9. # 允许MySQL端口通过防火墙
  10. sudo firewall-cmd --permanent --add-port=3306/tcp
  11. sudo firewall-cmd --reload
  12. # 检查MySQL配置文件中的bind-address设置
  13. sudo grep -n "bind-address" /etc/my.cnf
  14. # 修改bind-address为0.0.0.0以允许远程连接
  15. sudo sed -i 's/bind-address = 127.0.0.1/bind-address = 0.0.0.0/g' /etc/my.cnf
  16. sudo systemctl restart mysqld
  17. # 检查用户权限设置
  18. mysql -u root -p -e "SELECT host, user FROM mysql.user;"
复制代码

解决方案:
  1. -- 查看慢查询日志
  2. SHOW VARIABLES LIKE 'slow_query_log';
  3. SHOW VARIABLES LIKE 'slow_query_log_file';
  4. SHOW VARIABLES LIKE 'long_query_time';
  5. -- 启用慢查询日志
  6. SET GLOBAL slow_query_log = 'ON';
  7. SET GLOBAL long_query_time = 2;
  8. -- 查看当前运行的查询
  9. SHOW PROCESSLIST;
  10. SHOW FULL PROCESSLIST;
  11. -- 终止长时间运行的查询
  12. KILL QUERY process_id;
  13. -- 分析表
  14. ANALYZE TABLE table_name;
  15. -- 优化表
  16. OPTIMIZE TABLE table_name;
  17. -- 检查索引使用情况
  18. SELECT * FROM sys.schema_unused_indexes;
  19. SELECT * FROM sys.schema_redundant_indexes;
  20. -- 查看服务器状态
  21. SHOW STATUS LIKE 'Threads%';
  22. SHOW STATUS LIKE 'Connections';
  23. SHOW STATUS LIKE 'Max_used_connections';
  24. SHOW STATUS LIKE 'Table_locks%';
  25. SHOW STATUS LIKE 'Innodb_row_lock%';
复制代码

解决方案:
  1. # 检查磁盘空间使用情况
  2. df -h
  3. du -sh /var/lib/mysql/*
  4. # 清理二进制日志
  5. mysql -u root -p -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
  6. # 清理慢查询日志
  7. sudo rm /var/log/mysql/slow.log
  8. sudo touch /var/log/mysql/slow.log
  9. sudo chown mysql:mysql /var/log/mysql/slow.log
  10. sudo systemctl restart mysqld
  11. # 清理错误日志
  12. sudo rm /var/log/mysql/error.log
  13. sudo touch /var/log/mysql/error.log
  14. sudo chown mysql:mysql /var/log/mysql/error.log
  15. sudo systemctl restart mysqld
  16. # 优化表以释放空间
  17. mysql -u root -p -e "OPTIMIZE TABLE table_name;"
  18. # 启用二进制日志过期
  19. mysql -u root -p -e "SET GLOBAL expire_logs_days = 7;"
复制代码

2. PostgreSQL常见问题与解决方案

解决方案:
  1. # 检查PostgreSQL服务状态
  2. sudo systemctl status postgresql-12
  3. # 启动PostgreSQL服务
  4. sudo systemctl start postgresql-12
  5. # 检查PostgreSQL端口是否监听
  6. sudo netstat -tlnp | grep 5432
  7. # 检查防火墙设置
  8. sudo firewall-cmd --list-all
  9. # 允许PostgreSQL端口通过防火墙
  10. sudo firewall-cmd --permanent --add-port=5432/tcp
  11. sudo firewall-cmd --reload
  12. # 检查PostgreSQL配置文件中的listen_addresses设置
  13. sudo grep -n "listen_addresses" /var/lib/pgsql/12/data/postgresql.conf
  14. # 修改listen_addresses为'*'以允许远程连接
  15. sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/lib/pgsql/12/data/postgresql.conf
  16. sudo systemctl restart postgresql-12
  17. # 检查pg_hba.conf文件中的客户端认证设置
  18. sudo grep -n "host" /var/lib/pgsql/12/data/pg_hba.conf
  19. # 添加允许远程连接的规则
  20. echo "host all all 0.0.0.0/0 md5" | sudo tee -a /var/lib/pgsql/12/data/pg_hba.conf
  21. sudo systemctl restart postgresql-12
复制代码

解决方案:
  1. -- 查看当前运行的查询
  2. SELECT * FROM pg_stat_activity WHERE state = 'active';
  3. -- 终止长时间运行的查询
  4. SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'active' AND query_start < NOW() - INTERVAL '5 minutes';
  5. -- 分析表
  6. ANALYZE table_name;
  7. VACUUM ANALYZE table_name;
  8. -- 清理表
  9. VACUUM table_name;
  10. VACUUM FULL table_name;
  11. -- 检查索引使用情况
  12. SELECT * FROM pg_stat_user_indexes WHERE idx_scan = 0;
  13. -- 查看表膨胀情况
  14. SELECT schemaname, tablename, n_tup_ins, n_tup_upd, n_tup_del, n_live_tup, n_dead_tup, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze
  15. FROM pg_stat_user_tables
  16. ORDER BY n_dead_tup DESC;
  17. -- 重建索引
  18. REINDEX INDEX index_name;
  19. REINDEX TABLE table_name;
复制代码

解决方案:
  1. # 检查磁盘空间使用情况
  2. df -h
  3. du -sh /var/lib/pgsql/12/data/*
  4. # 清理WAL日志
  5. # 检查WAL日志数量
  6. sudo ls -l /var/lib/pgsql/12/data/pg_wal | wc -l
  7. # 调整WAL日志保留数量
  8. sudo vi /var/lib/pgsql/12/data/postgresql.conf
复制代码

添加或修改以下配置:
  1. wal_keep_segments = 100
  2. max_wal_size = 1GB
复制代码

重启PostgreSQL服务:
  1. sudo systemctl restart postgresql-12
复制代码

清理表空间:
  1. -- 清理表
  2. VACUUM FULL table_name;
  3. -- 清理数据库
  4. VACUUM FULL;
  5. -- 重建表
  6. CLUSTER table_name;
  7. -- 重建索引
  8. REINDEX DATABASE database_name;
复制代码

3. MongoDB常见问题与解决方案

解决方案:
  1. # 检查MongoDB服务状态
  2. sudo systemctl status mongod
  3. # 启动MongoDB服务
  4. sudo systemctl start mongod
  5. # 检查MongoDB端口是否监听
  6. sudo netstat -tlnp | grep 27017
  7. # 检查防火墙设置
  8. sudo firewall-cmd --list-all
  9. # 允许MongoDB端口通过防火墙
  10. sudo firewall-cmd --permanent --add-port=27017/tcp
  11. sudo firewall-cmd --reload
  12. # 检查MongoDB配置文件中的bindIp设置
  13. sudo grep -n "bindIp" /etc/mongod.conf
  14. # 修改bindIp为0.0.0.0以允许远程连接
  15. sudo sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/' /etc/mongod.conf
  16. sudo systemctl restart mongod
  17. # 检查MongoDB日志
  18. sudo tail -n 100 /var/log/mongodb/mongod.log
复制代码

解决方案:
  1. // 查看当前运行的查询
  2. db.currentOp()
  3. // 终止长时间运行的查询
  4. db.killOp(opid)
  5. // 查看索引使用情况
  6. db.collection.aggregate([ { $indexStats: {} } ])
  7. // 创建缺失的索引
  8. db.collection.createIndex({ field: 1 })
  9. // 查看服务器状态
  10. db.serverStatus()
  11. // 查看数据库状态
  12. db.stats()
  13. // 查看集合状态
  14. db.collection.stats()
  15. // 重建索引
  16. db.collection.reIndex()
  17. // 压缩集合
  18. db.collection.runCommand("compact")
  19. // 清理碎片
  20. db.repairDatabase()
复制代码

解决方案:
  1. # 检查磁盘空间使用情况
  2. df -h
  3. du -sh /var/lib/mongo/*
  4. # 检查MongoDB数据目录大小
  5. du -sh /data/mongodb/*
  6. # 检查集合大小
  7. mongo --eval "db.stats().dataSize + db.stats().indexSize"
  8. # 启用集合TTL索引自动过期数据
  9. mongo
  10. // 在MongoDB shell中
  11. use mydb
  12. db.collection.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 })
  13. // 查看TTL索引
  14. db.collection.getIndexes()
  15. // 删除过期数据
  16. db.collection.remove({ "createdAt": { $lt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) } })
  17. // 压缩集合
  18. db.collection.runCommand("compact")
  19. // 清理碎片
  20. db.repairDatabase()
复制代码

九、总结

在CentOS服务器环境下部署数据库是一个系统性的工程,涉及多个环节和众多细节。本文从准备工作开始,详细介绍了数据库的选择与安装、基本配置、安全设置、性能优化、备份与恢复、监控与维护等关键环节,并提供了一系列实用技巧和常见问题的解决方案。

数据库部署不仅仅是简单的安装和配置,还需要根据实际应用场景和业务需求进行针对性的优化。无论是选择MySQL/MariaDB、PostgreSQL还是MongoDB,都需要综合考虑性能、安全性、可靠性和可维护性等因素。

在实际部署过程中,建议遵循以下最佳实践:

1. 充分规划:在部署前充分评估业务需求,选择合适的数据库类型和版本。
2. 安全第一:始终将安全性放在首位,实施严格的访问控制和数据加密。
3. 性能优化:根据服务器硬件配置和应用特点,合理调整数据库参数。
4. 定期备份:建立完善的备份策略,确保数据安全。
5. 持续监控:实施全面的监控,及时发现并解决问题。
6. 文档记录:详细记录部署过程和配置参数,便于后续维护和故障排查。

通过遵循这些原则和方法,可以在CentOS服务器环境下成功部署高性能、高可用、高安全的数据库系统,为业务应用提供可靠的数据支持。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则