|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
在当今数据驱动的时代,数据库作为信息存储和管理的核心组件,其部署和管理显得尤为重要。CentOS作为企业级Linux发行版,以其稳定性和安全性成为众多服务器系统的首选。本文将详细介绍在CentOS服务器环境下部署数据库的全过程,从准备工作到安装配置,再到安全设置和性能优化,并提供一系列实用技巧和问题解决方案,帮助读者顺利完成数据库部署工作。
一、准备工作
1. 系统要求确认
在开始数据库部署前,首先需要确认系统是否满足数据库运行的最低要求:
- # 检查CentOS版本
- cat /etc/centos-release
- # 检查系统内核版本
- uname -r
- # 检查系统架构
- uname -m
- # 检查内存大小
- free -h
- # 检查磁盘空间
- df -h
复制代码
2. 系统更新与基础软件安装
确保系统是最新的,并安装必要的软件包:
- # 更新系统
- sudo yum update -y
- # 安装基础工具包
- sudo yum install -y wget vim curl net-tools epel-release
- # 安装开发工具包(编译安装时需要)
- sudo yum groupinstall -y "Development Tools"
复制代码
3. 创建专用用户和组
为数据库服务创建专用用户和组,提高安全性:
- # 创建mysql用户组(以MySQL为例)
- sudo groupadd mysql
- # 创建mysql用户并添加到mysql组
- sudo useradd -r -g mysql -s /bin/false mysql
复制代码
4. 配置防火墙和SELinux
根据需要配置防火墙和SELinux:
- # 检查防火墙状态
- sudo firewall-cmd --state
- # 开放数据库端口(以MySQL默认端口3306为例)
- sudo firewall-cmd --permanent --add-port=3306/tcp
- sudo firewall-cmd --reload
- # 检查SELinux状态
- sestatus
- # 临时关闭SELinux(不推荐生产环境使用)
- sudo setenforce 0
- # 永久关闭SELinux(需要重启)
- sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
复制代码
5. 创建数据目录
为数据库创建专用数据目录,并设置适当的权限:
- # 创建数据目录
- sudo mkdir -p /data/mysql
- # 设置目录所有者
- sudo chown -R mysql:mysql /data/mysql
- # 设置目录权限
- sudo chmod -R 750 /data/mysql
复制代码
二、数据库选择与安装
1. MySQL/MariaDB安装
- # 安装MariaDB(CentOS 7默认)
- sudo yum install -y mariadb-server mariadb
- # 或者安装MySQL
- # 首先添加MySQL官方仓库
- sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
- # 安装MySQL服务器
- sudo yum install -y mysql-community-server
复制代码
如果需要特定版本或定制配置,可以选择源码编译安装:
- # 下载MySQL源码
- wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28.tar.gz
- # 解压
- tar -zxvf mysql-8.0.28.tar.gz
- cd mysql-8.0.28
- # 创建编译目录
- mkdir build && cd build
- # 配置编译选项
- cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
- -DMYSQL_DATADIR=/data/mysql \
- -DSYSCONFDIR=/etc \
- -DWITH_INNOBASE_STORAGE_ENGINE=1 \
- -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
- -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
- -DWITH_READLINE=1 \
- -DWITH_SSL=system \
- -DWITH_ZLIB=system \
- -DWITH_LIBWRAP=0 \
- -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
- -DDEFAULT_CHARSET=utf8mb4 \
- -DDEFAULT_COLLATION=utf8mb4_general_ci \
- -DENABLED_LOCAL_INFILE=1 \
- -DWITH_PARTITION_STORAGE_ENGINE=1 \
- -DMYSQL_USER=mysql
- # 编译并安装
- make && sudo make install
复制代码
2. PostgreSQL安装
- # 安装PostgreSQL
- sudo yum install -y postgresql-server postgresql-contrib
- # 或者使用PostgreSQL官方仓库
- sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
- # 安装PostgreSQL 12(以12版本为例)
- sudo yum install -y postgresql12-server postgresql12-contrib
复制代码
3. MongoDB安装
- # 创建MongoDB仓库文件
- sudo tee /etc/yum.repos.d/mongodb-org.repo << EOF
- [mongodb-org-4.4]
- name=MongoDB Repository
- baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/4.4/x86_64/
- gpgcheck=1
- enabled=1
- gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
- EOF
- # 安装MongoDB
- sudo yum install -y mongodb-org
复制代码
三、基本配置
1. MySQL/MariaDB初始化配置
- # 初始化MySQL数据目录
- sudo mysqld --initialize --user=mysql --datadir=/data/mysql
- # 记录生成的临时root密码
- # 启动MySQL服务
- sudo systemctl start mysqld
- sudo systemctl enable mysqld
- # 安全初始化脚本
- sudo mysql_secure_installation
复制代码
编辑MySQL配置文件/etc/my.cnf或/etc/mysql/my.cnf:
- [mysqld]
- # 基本设置
- port = 3306
- socket = /tmp/mysql.sock
- pid-file = /var/run/mysqld/mysqld.pid
- datadir = /data/mysql
- # 字符集设置
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
- init-connect = 'SET NAMES utf8mb4'
- # 连接设置
- max_connections = 500
- max_connect_errors = 100000
- back_log = 512
- max_allowed_packet = 64M
- interactive_timeout = 28800
- wait_timeout = 28800
- # InnoDB设置
- innodb_buffer_pool_size = 4G # 根据服务器内存调整,通常为系统内存的50%-70%
- innodb_log_file_size = 1G
- innodb_log_buffer_size = 64M
- innodb_flush_log_at_trx_commit = 2
- innodb_lock_wait_timeout = 50
- innodb_file_per_table = 1
- # 日志设置
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 2
- log_queries_not_using_indexes = 1
- # 其他设置
- expire_logs_days = 7
- max_binlog_size = 1G
复制代码
2. PostgreSQL初始化配置
- # 初始化数据库集群
- sudo postgresql-setup initdb
- # 启动PostgreSQL服务
- sudo systemctl start postgresql
- sudo systemctl enable postgresql
复制代码
编辑PostgreSQL配置文件/var/lib/pgsql/12/data/postgresql.conf:
- # 连接设置
- listen_addresses = '*' # 根据安全需求调整
- port = 5432
- max_connections = 100
- # 内存设置
- shared_buffers = 1GB # 通常为系统内存的25%
- effective_cache_size = 3GB # 通常为系统内存的50%-75%
- work_mem = 16MB
- maintenance_work_mem = 256MB
- # 日志设置
- logging_collector = on
- log_directory = 'pg_log'
- log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
- log_statement = 'all'
- log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '
- # 查询优化
- random_page_cost = 1.1 # SSD使用此值
- effective_io_concurrency = 200 # SSD使用此值
复制代码
编辑客户端认证配置文件/var/lib/pgsql/12/data/pg_hba.conf:
- # 允许本地所有用户使用md5密码认证连接所有数据库
- local all all md5
- # 允许IP地址为192.168.1.0/24的所有主机使用md5密码认证连接所有数据库
- host all all 192.168.1.0/24 md5
复制代码
3. MongoDB初始化配置
- # 创建数据目录和日志目录
- sudo mkdir -p /data/mongodb
- sudo mkdir -p /var/log/mongodb
- sudo chown -R mongod:mongod /data/mongodb /var/log/mongodb
- # 启动MongoDB服务
- sudo systemctl start mongod
- sudo systemctl enable mongod
复制代码
编辑MongoDB配置文件/etc/mongod.conf:
- storage:
- dbPath: /data/mongodb
- journal:
- enabled: true
- wiredTiger:
- engineConfig:
- cacheSizeGB: 2 # 根据服务器内存调整,通常为系统内存的50%
- systemLog:
- destination: file
- logAppend: true
- path: /var/log/mongodb/mongod.log
- net:
- port: 27017
- bindIp: 0.0.0.0 # 根据安全需求调整
- security:
- authorization: enabled
- operationProfiling:
- slowOpThresholdMs: 100
- mode: slowOp
- replication:
- replSetName: rs0 # 如果使用副本集
复制代码
四、安全设置
1. 用户和权限管理
- -- 登录MySQL
- mysql -u root -p
- -- 创建数据库
- CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- -- 创建用户并设置密码
- CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'strong_password';
- CREATE USER 'myuser'@'%' IDENTIFIED BY 'strong_password';
- -- 授予用户权限
- GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
- GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'myuser'@'%';
- -- 刷新权限
- FLUSH PRIVILEGES;
- -- 查看用户权限
- SHOW GRANTS FOR 'myuser'@'localhost';
- -- 撤销权限
- REVOKE DELETE ON mydb.* FROM 'myuser'@'%';
- -- 删除用户
- DROP USER 'myuser'@'%';
复制代码- # 切换到postgres用户
- sudo -u postgres psql
- # 创建数据库
- CREATE DATABASE mydb;
- # 创建用户
- CREATE USER myuser WITH PASSWORD 'strong_password';
- # 授予用户数据库权限
- GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
- # 授予用户模式权限
- \c mydb
- GRANT ALL ON SCHEMA public TO myuser;
- # 查看用户权限
- \du myuser
- # 撤销权限
- REVOKE ALL ON DATABASE mydb FROM myuser;
- # 删除用户
- DROP USER myuser;
复制代码- // 连接到MongoDB
- mongo
- // 切换到admin数据库
- use admin
- // 创建管理员用户
- db.createUser({
- user: "admin",
- pwd: "strong_password",
- roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
- })
- // 认证管理员
- db.auth("admin", "strong_password")
- // 创建普通数据库用户
- use mydb
- db.createUser({
- user: "myuser",
- pwd: "strong_password",
- roles: [{ role: "readWrite", db: "mydb" }]
- })
- // 查看用户
- use mydb
- show users
- // 删除用户
- db.dropUser("myuser")
复制代码
2. SSL/TLS加密配置
- # 创建SSL证书目录
- sudo mkdir -p /etc/mysql/ssl
- cd /etc/mysql/ssl
- # 生成CA证书
- sudo openssl genrsa 2048 > ca-key.pem
- sudo openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem
- # 生成服务器证书
- sudo openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem
- sudo openssl rsa -in server-key.pem -out server-key.pem
- sudo openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
- # 生成客户端证书
- sudo openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem
- sudo openssl rsa -in client-key.pem -out client-key.pem
- sudo openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
- # 设置权限
- sudo chown -R mysql:mysql /etc/mysql/ssl
- sudo chmod 600 /etc/mysql/ssl/*.pem
复制代码
编辑MySQL配置文件/etc/my.cnf,添加SSL配置:
- [mysqld]
- ssl-ca = /etc/mysql/ssl/ca.pem
- ssl-cert = /etc/mysql/ssl/server-cert.pem
- ssl-key = /etc/mysql/ssl/server-key.pem
复制代码
重启MySQL服务:
- sudo systemctl restart mysqld
复制代码
验证SSL是否启用:
- SHOW VARIABLES LIKE '%ssl%';
复制代码- # 创建SSL证书目录
- sudo mkdir -p /var/lib/pgsql/12/data/ssl
- cd /var/lib/pgsql/12/data/ssl
- # 生成服务器证书
- sudo openssl req -new -x509 -days 3650 -nodes -text -out server.crt -keyout server.key -subj "/CN=postgres"
- sudo chmod og-rwx server.key
- # 编辑PostgreSQL配置文件
- sudo vi /var/lib/pgsql/12/data/postgresql.conf
复制代码
添加以下配置:
- ssl = on
- ssl_cert_file = 'ssl/server.crt'
- ssl_key_file = 'ssl/server.key'
复制代码
重启PostgreSQL服务:
- sudo systemctl restart postgresql-12
复制代码- # 创建SSL证书目录
- sudo mkdir -p /etc/mongodb/ssl
- cd /etc/mongodb/ssl
- # 生成CA证书
- sudo openssl genrsa -out ca.key 2048
- sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=MongoDB CA"
- # 生成服务器证书
- sudo openssl genrsa -out server.key 2048
- sudo openssl req -new -key server.key -out server.csr -subj "/CN=mongodb.example.com"
- sudo openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
- # 生成客户端证书
- sudo openssl genrsa -out client.key 2048
- sudo openssl req -new -key client.key -out client.csr -subj "/CN=MongoDB Client"
- sudo openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
- # 合并证书和私钥
- sudo cat client.key client.crt > client.pem
- sudo cat server.key server.crt > server.pem
- # 设置权限
- sudo chown -R mongod:mongod /etc/mongodb/ssl
- sudo chmod 600 /etc/mongodb/ssl/*.pem
复制代码
编辑MongoDB配置文件/etc/mongod.conf,添加SSL配置:
- net:
- ssl:
- mode: requireSSL
- PEMKeyFile: /etc/mongodb/ssl/server.pem
- CAFile: /etc/mongodb/ssl/ca.crt
复制代码
重启MongoDB服务:
- sudo systemctl restart mongod
复制代码
3. 防火墙与访问控制
- # 安装iptables
- sudo yum install -y iptables-services
- # 停止firewalld
- sudo systemctl stop firewalld
- sudo systemctl mask firewalld
- # 启动iptables
- sudo systemctl enable iptables
- sudo systemctl start iptables
- # 允许本地回环
- sudo iptables -A INPUT -i lo -j ACCEPT
- # 允许已建立的连接
- sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- # 允许SSH连接
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- # 允许特定IP访问MySQL端口
- sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
- # 允许特定IP访问PostgreSQL端口
- sudo iptables -A INPUT -p tcp --dport 5432 -s 192.168.1.0/24 -j ACCEPT
- # 允许特定IP访问MongoDB端口
- sudo iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
- # 拒绝所有其他输入
- sudo iptables -A INPUT -j DROP
- # 保存规则
- sudo service iptables save
复制代码
编辑/etc/hosts.allow文件:
- # 允许特定IP访问MySQL
- mysqld: 192.168.1.0/24
- # 允许特定IP访问PostgreSQL
- postgresql: 192.168.1.0/24
- # 允许特定IP访问MongoDB
- mongod: 192.168.1.0/24
复制代码
编辑/etc/hosts.deny文件:
- # 拒绝所有其他访问
- mysqld: ALL
- postgresql: ALL
- mongod: ALL
复制代码
五、性能优化
1. MySQL/MariaDB性能优化
编辑MySQL配置文件/etc/my.cnf,根据服务器硬件配置调整以下参数:
- [mysqld]
- # InnoDB缓冲池大小,通常为系统内存的50%-70%
- innodb_buffer_pool_size = 8G
- # InnoDB日志文件大小,通常为缓冲池大小的25%
- innodb_log_file_size = 2G
- # InnoDB刷新策略,1为完全ACID,2为性能优先
- innodb_flush_log_at_trx_commit = 2
- # InnoDB IO能力,SSD可设置为10000,普通硬盘可设置为200
- innodb_io_capacity = 2000
- # 查询缓存,MySQL 8.0已移除,仅适用于MySQL 5.7及以下版本
- query_cache_type = 1
- query_cache_size = 128M
- query_cache_limit = 2M
- # 表定义缓存
- table_definition_cache = 2000
- table_open_cache = 2000
- # 临时表
- tmp_table_size = 256M
- max_heap_table_size = 256M
- # 线程缓存
- thread_cache_size = 16
- # 连接超时
- wait_timeout = 300
- interactive_timeout = 300
- # 慢查询日志
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 2
- log_queries_not_using_indexes = 1
复制代码- -- 分析表使用情况
- SELECT table_schema, table_name, index_name
- FROM information_schema.statistics
- WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema');
- -- 查看索引使用情况
- SELECT object_schema, object_name, index_name
- FROM performance_schema.table_io_waits_summary_by_index_usage
- WHERE index_name IS NOT NULL
- AND count_star > 0
- ORDER BY count_star DESC;
- -- 查看未使用的索引
- SELECT object_schema, object_name, index_name
- FROM performance_schema.table_io_waits_summary_by_index_usage
- WHERE index_name IS NOT NULL
- AND count_star = 0
- AND object_schema NOT IN ('mysql', 'information_schema', 'performance_schema')
- ORDER BY object_schema, object_name;
- -- 创建索引
- CREATE INDEX idx_name ON table_name(column_name);
- -- 创建复合索引
- CREATE INDEX idx_name ON table_name(column1, column2);
- -- 删除索引
- DROP INDEX idx_name ON table_name;
复制代码- -- 使用EXPLAIN分析查询执行计划
- EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
- -- 使用EXPLAIN FORMAT=JSON获取更详细的执行计划
- EXPLAIN FORMAT=JSON SELECT * FROM table_name WHERE column_name = 'value';
- -- 使用EXPLAIN ANALYZE(MySQL 8.0+)获取实际执行时间和行数
- EXPLAIN ANALYZE SELECT * FROM table_name WHERE column_name = 'value';
- -- 使用SHOW PROFILE分析查询性能
- SET profiling = 1;
- SELECT * FROM table_name WHERE column_name = 'value';
- SHOW PROFILE;
- SHOW PROFILE FOR QUERY 1;
复制代码
2. PostgreSQL性能优化
编辑PostgreSQL配置文件/var/lib/pgsql/12/data/postgresql.conf,根据服务器硬件配置调整以下参数:
- # 连接设置
- max_connections = 200
- # 内存设置
- shared_buffers = 4GB # 通常为系统内存的25%
- effective_cache_size = 12GB # 通常为系统内存的50%-75%
- work_mem = 32MB # 排序操作使用的内存
- maintenance_work_mem = 512MB # 维护操作使用的内存
- # 检查点设置
- checkpoint_completion_target = 0.9 # 检查点完成目标
- checkpoint_timeout = 15min # 检查点超时时间
- max_wal_size = 4GB # WAL最大大小
- min_wal_size = 1GB # WAL最小大小
- # 查询优化
- random_page_cost = 1.1 # SSD使用此值
- effective_io_concurrency = 200 # SSD使用此值
- seq_page_cost = 1 # 顺序扫描成本
- # 日志设置
- log_min_duration_statement = 1000 # 记录执行时间超过1秒的查询
- log_checkpoints = on # 记录检查点
- log_connections = on # 记录连接
- log_disconnections = on # 记录断开连接
- # 统计信息收集
- track_activities = on
- track_counts = on
- track_io_timing = on
复制代码- -- 分析表
- ANALYZE table_name;
- -- 查看表大小
- SELECT pg_size_pretty(pg_total_relation_size('table_name'));
- -- 查看索引大小
- SELECT pg_size_pretty(pg_relation_size('index_name'));
- -- 创建B-tree索引
- CREATE INDEX idx_name ON table_name(column_name);
- -- 创建复合索引
- CREATE INDEX idx_name ON table_name(column1, column2);
- -- 创建部分索引
- CREATE INDEX idx_name ON table_name(column_name) WHERE condition;
- -- 创建哈希索引
- CREATE INDEX idx_name ON table_name USING hash(column_name);
- -- 删除索引
- DROP INDEX idx_name;
- -- 重建索引
- REINDEX INDEX idx_name;
- REINDEX TABLE table_name;
复制代码- -- 使用EXPLAIN分析查询执行计划
- EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
- -- 使用EXPLAIN ANALYZE获取实际执行时间和行数
- EXPLAIN ANALYZE SELECT * FROM table_name WHERE column_name = 'value';
- -- 使用EXPLAIN (ANALYZE, BUFFERS)获取缓冲区使用情况
- EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM table_name WHERE column_name = 'value';
- -- 使用EXPLAIN (ANALYZE, VERBOSE)获取更详细的执行计划
- EXPLAIN (ANALYZE, VERBOSE) SELECT * FROM table_name WHERE column_name = 'value';
复制代码
3. MongoDB性能优化
编辑MongoDB配置文件/etc/mongod.conf,根据服务器硬件配置调整以下参数:
- storage:
- dbPath: /data/mongodb
- journal:
- enabled: true
- wiredTiger:
- engineConfig:
- cacheSizeGB: 8 # 根据服务器内存调整,通常为系统内存的50%
- journalCompressor: snappy
- collectionConfig:
- blockCompressor: snappy
- indexConfig:
- prefixCompression: true
- operationProfiling:
- slowOpThresholdMs: 100
- mode: slowOp
- replication:
- oplogSizeMB: 2048 # 副本集操作日志大小
- net:
- port: 27017
- bindIp: 0.0.0.0
- maxIncomingConnections: 10000
- security:
- authorization: enabled
- setParameter:
- internalQueryExecMaxBlockingSortBytes: 104857600
- internalQueryExecYieldIterations: 1000000
复制代码- // 连接到MongoDB
- mongo
- // 切换到数据库
- use mydb
- // 创建单字段索引
- db.collection.createIndex({ field: 1 })
- // 创建复合索引
- db.collection.createIndex({ field1: 1, field2: -1 })
- // 创建唯一索引
- db.collection.createIndex({ field: 1 }, { unique: true })
- // 创建部分索引
- db.collection.createIndex({ field: 1 }, { partialFilterExpression: { field: { $exists: true } } })
- // 创建文本索引
- db.collection.createIndex({ field: "text" })
- // 查看索引
- db.collection.getIndexes()
- // 查看索引使用情况
- db.collection.aggregate([ { $indexStats: {} } ])
- // 删除索引
- db.collection.dropIndex({ field: 1 })
复制代码- // 使用explain()分析查询执行计划
- db.collection.find({ field: "value" }).explain()
- // 使用explain("executionStats")获取执行统计信息
- db.collection.find({ field: "value" }).explain("executionStats")
- // 使用explain("allPlansExecution")获取所有执行计划
- db.collection.find({ field: "value" }).explain("allPlansExecution")
- // 使用hint()强制使用特定索引
- db.collection.find({ field: "value" }).hint({ field: 1 })
- // 使用count()优化计数
- db.collection.count({ field: "value" })
- // 使用limit()限制返回结果数量
- db.collection.find({ field: "value" }).limit(10)
- // 使用skip()跳过指定数量的结果
- db.collection.find({ field: "value" }).skip(10).limit(10)
- // 使用sort()进行排序
- db.collection.find({ field: "value" }).sort({ other_field: 1 })
复制代码
六、备份与恢复
1. MySQL/MariaDB备份与恢复
- # 备份所有数据库
- mysqldump -u root -p --all-databases --single-transaction --routines --triggers --events > all_databases.sql
- # 备份指定数据库
- mysqldump -u root -p --single-transaction --routines --triggers mydb > mydb.sql
- # 备份指定表
- mysqldump -u root -p mydb table1 table2 > tables.sql
- # 压缩备份
- mysqldump -u root -p mydb | gzip > mydb.sql.gz
- # 恢复数据库
- mysql -u root -p mydb < mydb.sql
- # 恢复压缩的备份
- gunzip < mydb.sql.gz | mysql -u root -p mydb
复制代码- # 使用XtraBackup进行物理备份
- # 安装XtraBackup
- sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
- sudo yum install -y percona-xtrabackup-24
- # 创建完整备份
- sudo innobackupex --user=root --password=your_password /data/backups
- # 准备备份
- sudo innobackupex --apply-log /data/backups/2021-01-01_12-00-00
- # 恢复备份
- sudo systemctl stop mysqld
- sudo mv /data/mysql /data/mysql.bak
- sudo mkdir -p /data/mysql
- sudo innobackupex --copy-back /data/backups/2021-01-01_12-00-00
- sudo chown -R mysql:mysql /data/mysql
- sudo systemctl start mysqld
复制代码- # 创建完整备份
- sudo innobackupex --user=root --password=your_password /data/backups
- # 创建增量备份
- sudo innobackupex --user=root --password=your_password --incremental /data/backups --incremental-basedir=/data/backups/2021-01-01_12-00-00
- # 准备完整备份
- sudo innobackupex --apply-log --redo-only /data/backups/2021-01-01_12-00-00
- # 应用增量备份
- sudo innobackupex --apply-log --redo-only /data/backups/2021-01-01_12-00-00 --incremental-dir=/data/backups/2021-01-02_12-00-00
- # 恢复备份
- sudo systemctl stop mysqld
- sudo mv /data/mysql /data/mysql.bak
- sudo mkdir -p /data/mysql
- sudo innobackupex --copy-back /data/backups/2021-01-01_12-00-00
- sudo chown -R mysql:mysql /data/mysql
- sudo systemctl start mysqld
复制代码
2. PostgreSQL备份与恢复
- # 备份所有数据库
- pg_dumpall -U postgres -f all_databases.sql
- # 备份指定数据库
- pg_dump -U postgres -f mydb.sql mydb
- # 备份指定数据库并压缩
- pg_dump -U postgres mydb | gzip > mydb.sql.gz
- # 备份指定表
- pg_dump -U postgres -t table1 -t table2 -f tables.sql mydb
- # 恢复数据库
- psql -U postgres -f mydb.sql
- # 恢复压缩的备份
- gunzip -c mydb.sql.gz | psql -U postgres
- # 恢复所有数据库
- psql -U postgres -f all_databases.sql
复制代码- # 使用pg_basebackup进行物理备份
- # 配置PostgreSQL允许复制
- echo "host replication all 192.168.1.0/24 md5" | sudo tee -a /var/lib/pgsql/12/data/pg_hba.conf
- sudo systemctl restart postgresql-12
- # 创建物理备份
- pg_basebackup -U postgres -h localhost -D /data/backups/pg_backup -Ft -z -P
- # 恢复备份
- sudo systemctl stop postgresql-12
- sudo mv /var/lib/pgsql/12/data /var/lib/pgsql/12/data.bak
- sudo mkdir -p /var/lib/pgsql/12/data
- sudo tar -xzf /data/backups/pg_backup/base.tar.gz -C /var/lib/pgsql/12/data
- sudo chown -R postgres:postgres /var/lib/pgsql/12/data
- # 创建recovery.conf文件
- echo "standby_mode = 'on'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
- echo "primary_conninfo = 'host=localhost port=5432 user=postgres'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
- sudo systemctl start postgresql-12
复制代码- # 配置归档
- sudo vi /var/lib/pgsql/12/data/postgresql.conf
复制代码
添加以下配置:
- wal_level = replica
- archive_mode = on
- archive_command = 'test ! -f /data/backups/wal/%f && cp %p /data/backups/wal/%f'
- max_wal_senders = 3
复制代码
重启PostgreSQL服务:
- sudo systemctl restart postgresql-12
复制代码
创建基础备份:
- pg_basebackup -U postgres -h localhost -D /data/backups/pg_backup -Ft -z -P -Xs
复制代码
恢复备份:
- sudo systemctl stop postgresql-12
- sudo mv /var/lib/pgsql/12/data /var/lib/pgsql/12/data.bak
- sudo mkdir -p /var/lib/pgsql/12/data
- sudo tar -xzf /data/backups/pg_backup/base.tar.gz -C /var/lib/pgsql/12/data
- sudo chown -R postgres:postgres /var/lib/pgsql/12/data
- # 创建recovery.conf文件
- echo "restore_command = 'cp /data/backups/wal/%f %p'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
- echo "recovery_target_time = '2021-01-01 12:00:00'" | sudo tee -a /var/lib/pgsql/12/data/recovery.conf
- sudo systemctl start postgresql-12
复制代码
3. MongoDB备份与恢复
- # 备份所有数据库
- mongodump --username admin --password your_password --authenticationDatabase admin --out /data/backups/mongo_backup
- # 备份指定数据库
- mongodump --username admin --password your_password --authenticationDatabase admin --db mydb --out /data/backups/mydb_backup
- # 备份指定集合
- mongodump --username admin --password your_password --authenticationDatabase admin --db mydb --collection mycollection --out /data/backups/collection_backup
- # 恢复所有数据库
- mongorestore --username admin --password your_password --authenticationDatabase admin /data/backups/mongo_backup
- # 恢复指定数据库
- mongorestore --username admin --password your_password --authenticationDatabase admin --db mydb /data/backups/mydb_backup/mydb
- # 恢复指定集合
- mongorestore --username admin --password your_password --authenticationDatabase admin --db mydb --collection mycollection /data/backups/collection_backup/mydb/mycollection.bson
复制代码- # 创建文件系统快照(需要LVM支持)
- # 创建快照
- sudo lvcreate --size 1G --snapshot --name mongo_snap /dev/vg0/mongo_data
- # 挂载快照
- sudo mkdir -p /mnt/mongo_snap
- sudo mount /dev/vg0/mongo_snap /mnt/mongo_snap
- # 复制数据
- sudo cp -r /mnt/mongo_snap /data/backups/mongo_fs_backup
- # 卸载并删除快照
- sudo umount /mnt/mongo_snap
- sudo lvremove -f /dev/vg0/mongo_snap
复制代码- # 在副本集的辅助节点上创建备份
- mongodump --host secondary.example.com --port 27017 --username admin --password your_password --authenticationDatabase admin --out /data/backups/mongo_backup
- # 使用oplog进行时间点恢复
- mongodump --host secondary.example.com --port 27017 --username admin --password your_password --authenticationDatabase admin --oplog --out /data/backups/mongo_backup
复制代码
七、监控与维护
1. MySQL/MariaDB监控与维护
- -- 查看服务器状态
- SHOW STATUS;
- SHOW VARIABLES;
- -- 查看进程列表
- SHOW PROCESSLIST;
- SHOW FULL PROCESSLIST;
- -- 查看InnoDB状态
- SHOW ENGINE INNODB STATUS;
- -- 查看查询执行统计
- SELECT * FROM performance_schema.events_statements_summary_by_digest
- ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
- -- 查看表锁争用
- SELECT * FROM performance_schema.table_lock_waits_summary_by_table
- WHERE COUNT_STAR > 0
- ORDER BY SUM_TIMER_WAIT DESC;
- -- 查看索引使用情况
- SELECT * FROM performance_schema.table_io_waits_summary_by_index_usage
- WHERE index_name IS NOT NULL
- ORDER BY COUNT_STAR DESC;
- -- 查看表IO统计
- SELECT * FROM performance_schema.table_io_waits_summary_by_table
- ORDER BY SUM_TIMER_WAIT DESC;
复制代码- -- 分析表
- ANALYZE TABLE table_name;
- -- 优化表
- OPTIMIZE TABLE table_name;
- -- 检查表
- CHECK TABLE table_name;
- -- 修复表
- REPAIR TABLE table_name;
- -- 清理二进制日志
- PURGE BINARY LOGS TO 'mysql-bin.000100';
- PURGE BINARY LOGS BEFORE '2021-01-01 12:00:00';
- -- 刷新表
- FLUSH TABLES;
- -- 刷新权限
- FLUSH PRIVILEGES;
- -- 刷新日志
- FLUSH LOGS;
- -- 重置查询缓存
- RESET QUERY CACHE;
复制代码- # 安装Percona Monitoring and Management (PMM)
- # 安装Docker
- sudo yum install -y docker
- sudo systemctl start docker
- sudo systemctl enable docker
- # 安装PMM服务器
- docker run -d \
- -p 80:80 \
- -p 443:443 \
- --name pmm-server \
- -v /opt/prometheus/data \
- -v /opt/consul-data \
- -v /var/lib/mysql \
- -v /var/lib/grafana \
- --restart always \
- percona/pmm-server:latest
- # 安装PMM客户端
- sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
- sudo yum install -y pmm2-client
- # 配置PMM客户端
- pmm-admin config --server-insecure-tls --server-url=https://admin:admin@pmm-server-ip --force
- # 添加MySQL监控
- pmm-admin add mysql --username=root --password=your_password
复制代码
2. PostgreSQL监控与维护
- -- 查看服务器状态
- SELECT * FROM pg_stat_activity;
- SELECT * FROM pg_stat_database;
- SELECT * FROM pg_stat_user_tables;
- SELECT * FROM pg_stat_user_indexes;
- -- 查看表大小
- SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
- FROM pg_tables
- WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
- ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
- -- 查看索引大小
- SELECT schemaname, tablename, indexname, pg_size_pretty(pg_relation_size(schemaname||'.'||indexname)) as size
- FROM pg_indexes
- WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
- ORDER BY pg_relation_size(schemaname||'.'||indexname) DESC;
- -- 查看查询执行统计
- SELECT query, calls, total_time, mean_time, rows
- FROM pg_stat_statements
- ORDER BY total_time DESC LIMIT 10;
- -- 查看表IO统计
- SELECT schemaname, tablename, heap_blks_read, heap_blks_hit
- FROM pg_statio_user_tables
- ORDER BY heap_blks_read DESC;
复制代码- -- 分析表
- ANALYZE table_name;
- VACUUM ANALYZE table_name;
- -- 清理表
- VACUUM table_name;
- VACUUM FULL table_name;
- -- 重建表
- CLUSTER table_name;
- ALTER TABLE table_name SET TABLESPACE new_tablespace;
- -- 重建索引
- REINDEX INDEX index_name;
- REINDEX TABLE table_name;
- REINDEX DATABASE database_name;
- -- 清理过期事务
- VACUUM;
- -- 更新统计信息
- ANALYZE;
复制代码- # 安装pgAdmin
- sudo yum install -y https://ftp.postgresql.org/pub/pgadmin/pgadmin4/yum/pgadmin4-redhat-repo-2-1.noarch.rpm
- sudo yum install -y pgadmin4
- # 配置pgAdmin
- sudo /usr/pgadmin4/bin/setup-web.sh
- # 安装PostgreSQL监控扩展
- CREATE EXTENSION pg_stat_statements;
- CREATE EXTENSION pg_buffercache;
- CREATE EXTENSION pg_stat_kcache;
- CREATE EXTENSION pg_qualstats;
复制代码
3. MongoDB监控与维护
- // 查看服务器状态
- db.serverStatus()
- db.stats()
- db.collection.stats()
- // 查看当前操作
- db.currentOp()
- // 查看慢查询
- db.collection.find({}, {"_id": 0}).sort({"$natural": -1}).limit(10).explain("executionStats")
- // 查看索引使用情况
- db.collection.aggregate([ { $indexStats: {} } ])
- // 查看复制状态
- rs.status()
- rs.printReplicationInfo()
- rs.printSlaveReplicationInfo()
- // 查看锁状态
- db.serverStatus().locks
复制代码- // 分析集合
- db.collection.validate()
- // 重建索引
- db.collection.reIndex()
- // 压缩集合
- db.collection.runCommand("compact")
- // 清理碎片
- db.repairDatabase()
- // 查看并终止长时间运行的操作
- db.currentOp().inprog.forEach(function(op) {
- if(op.secs_running > 60) {
- db.killOp(op.opid);
- }
- })
复制代码- # 安装MongoDB Ops Manager
- # 下载Ops Manager
- wget https://downloads.mongodb.com/on-prem-mms/rpm/mongodb-mms-4.4.14.59960-1.x86_64.rhel7.rpm
- # 安装Ops Manager
- sudo rpm -ivh mongodb-mms-4.4.14.59960-1.x86_64.rhel7.rpm
- # 配置Ops Manager
- sudo vi /opt/mongodb/mms/conf/conf-mms.properties
- # 启动Ops Manager
- sudo systemctl start mongodb-mms
- # 安装MongoDB监控代理
- # 下载监控代理
- wget https://downloads.mongodb.com/on-prem-mms/agent/mongodb-mms-automation-agent-10.14.18.5996-1.x86_64.rhel7.rpm
- # 安装监控代理
- sudo rpm -ivh mongodb-mms-automation-agent-10.14.18.5996-1.x86_64.rhel7.rpm
- # 配置监控代理
- sudo vi /etc/mongodb-mms/automation-agent.config
- # 启动监控代理
- sudo systemctl start mongodb-mms-automation-agent
复制代码
八、常见问题与解决方案
1. MySQL/MariaDB常见问题与解决方案
解决方案:
- # 检查MySQL服务状态
- sudo systemctl status mysqld
- # 启动MySQL服务
- sudo systemctl start mysqld
- # 检查MySQL端口是否监听
- sudo netstat -tlnp | grep 3306
- # 检查防火墙设置
- sudo firewall-cmd --list-all
- # 允许MySQL端口通过防火墙
- sudo firewall-cmd --permanent --add-port=3306/tcp
- sudo firewall-cmd --reload
- # 检查MySQL配置文件中的bind-address设置
- sudo grep -n "bind-address" /etc/my.cnf
- # 修改bind-address为0.0.0.0以允许远程连接
- sudo sed -i 's/bind-address = 127.0.0.1/bind-address = 0.0.0.0/g' /etc/my.cnf
- sudo systemctl restart mysqld
- # 检查用户权限设置
- mysql -u root -p -e "SELECT host, user FROM mysql.user;"
复制代码
解决方案:
- -- 查看慢查询日志
- SHOW VARIABLES LIKE 'slow_query_log';
- SHOW VARIABLES LIKE 'slow_query_log_file';
- SHOW VARIABLES LIKE 'long_query_time';
- -- 启用慢查询日志
- SET GLOBAL slow_query_log = 'ON';
- SET GLOBAL long_query_time = 2;
- -- 查看当前运行的查询
- SHOW PROCESSLIST;
- SHOW FULL PROCESSLIST;
- -- 终止长时间运行的查询
- KILL QUERY process_id;
- -- 分析表
- ANALYZE TABLE table_name;
- -- 优化表
- OPTIMIZE TABLE table_name;
- -- 检查索引使用情况
- SELECT * FROM sys.schema_unused_indexes;
- SELECT * FROM sys.schema_redundant_indexes;
- -- 查看服务器状态
- SHOW STATUS LIKE 'Threads%';
- SHOW STATUS LIKE 'Connections';
- SHOW STATUS LIKE 'Max_used_connections';
- SHOW STATUS LIKE 'Table_locks%';
- SHOW STATUS LIKE 'Innodb_row_lock%';
复制代码
解决方案:
- # 检查磁盘空间使用情况
- df -h
- du -sh /var/lib/mysql/*
- # 清理二进制日志
- mysql -u root -p -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
- # 清理慢查询日志
- sudo rm /var/log/mysql/slow.log
- sudo touch /var/log/mysql/slow.log
- sudo chown mysql:mysql /var/log/mysql/slow.log
- sudo systemctl restart mysqld
- # 清理错误日志
- sudo rm /var/log/mysql/error.log
- sudo touch /var/log/mysql/error.log
- sudo chown mysql:mysql /var/log/mysql/error.log
- sudo systemctl restart mysqld
- # 优化表以释放空间
- mysql -u root -p -e "OPTIMIZE TABLE table_name;"
- # 启用二进制日志过期
- mysql -u root -p -e "SET GLOBAL expire_logs_days = 7;"
复制代码
2. PostgreSQL常见问题与解决方案
解决方案:
- # 检查PostgreSQL服务状态
- sudo systemctl status postgresql-12
- # 启动PostgreSQL服务
- sudo systemctl start postgresql-12
- # 检查PostgreSQL端口是否监听
- sudo netstat -tlnp | grep 5432
- # 检查防火墙设置
- sudo firewall-cmd --list-all
- # 允许PostgreSQL端口通过防火墙
- sudo firewall-cmd --permanent --add-port=5432/tcp
- sudo firewall-cmd --reload
- # 检查PostgreSQL配置文件中的listen_addresses设置
- sudo grep -n "listen_addresses" /var/lib/pgsql/12/data/postgresql.conf
- # 修改listen_addresses为'*'以允许远程连接
- sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/lib/pgsql/12/data/postgresql.conf
- sudo systemctl restart postgresql-12
- # 检查pg_hba.conf文件中的客户端认证设置
- sudo grep -n "host" /var/lib/pgsql/12/data/pg_hba.conf
- # 添加允许远程连接的规则
- echo "host all all 0.0.0.0/0 md5" | sudo tee -a /var/lib/pgsql/12/data/pg_hba.conf
- sudo systemctl restart postgresql-12
复制代码
解决方案:
- -- 查看当前运行的查询
- SELECT * FROM pg_stat_activity WHERE state = 'active';
- -- 终止长时间运行的查询
- SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'active' AND query_start < NOW() - INTERVAL '5 minutes';
- -- 分析表
- ANALYZE table_name;
- VACUUM ANALYZE table_name;
- -- 清理表
- VACUUM table_name;
- VACUUM FULL table_name;
- -- 检查索引使用情况
- SELECT * FROM pg_stat_user_indexes WHERE idx_scan = 0;
- -- 查看表膨胀情况
- 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
- FROM pg_stat_user_tables
- ORDER BY n_dead_tup DESC;
- -- 重建索引
- REINDEX INDEX index_name;
- REINDEX TABLE table_name;
复制代码
解决方案:
- # 检查磁盘空间使用情况
- df -h
- du -sh /var/lib/pgsql/12/data/*
- # 清理WAL日志
- # 检查WAL日志数量
- sudo ls -l /var/lib/pgsql/12/data/pg_wal | wc -l
- # 调整WAL日志保留数量
- sudo vi /var/lib/pgsql/12/data/postgresql.conf
复制代码
添加或修改以下配置:
- wal_keep_segments = 100
- max_wal_size = 1GB
复制代码
重启PostgreSQL服务:
- sudo systemctl restart postgresql-12
复制代码
清理表空间:
- -- 清理表
- VACUUM FULL table_name;
- -- 清理数据库
- VACUUM FULL;
- -- 重建表
- CLUSTER table_name;
- -- 重建索引
- REINDEX DATABASE database_name;
复制代码
3. MongoDB常见问题与解决方案
解决方案:
- # 检查MongoDB服务状态
- sudo systemctl status mongod
- # 启动MongoDB服务
- sudo systemctl start mongod
- # 检查MongoDB端口是否监听
- sudo netstat -tlnp | grep 27017
- # 检查防火墙设置
- sudo firewall-cmd --list-all
- # 允许MongoDB端口通过防火墙
- sudo firewall-cmd --permanent --add-port=27017/tcp
- sudo firewall-cmd --reload
- # 检查MongoDB配置文件中的bindIp设置
- sudo grep -n "bindIp" /etc/mongod.conf
- # 修改bindIp为0.0.0.0以允许远程连接
- sudo sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/' /etc/mongod.conf
- sudo systemctl restart mongod
- # 检查MongoDB日志
- sudo tail -n 100 /var/log/mongodb/mongod.log
复制代码
解决方案:
- // 查看当前运行的查询
- db.currentOp()
- // 终止长时间运行的查询
- db.killOp(opid)
- // 查看索引使用情况
- db.collection.aggregate([ { $indexStats: {} } ])
- // 创建缺失的索引
- db.collection.createIndex({ field: 1 })
- // 查看服务器状态
- db.serverStatus()
- // 查看数据库状态
- db.stats()
- // 查看集合状态
- db.collection.stats()
- // 重建索引
- db.collection.reIndex()
- // 压缩集合
- db.collection.runCommand("compact")
- // 清理碎片
- db.repairDatabase()
复制代码
解决方案:
- # 检查磁盘空间使用情况
- df -h
- du -sh /var/lib/mongo/*
- # 检查MongoDB数据目录大小
- du -sh /data/mongodb/*
- # 检查集合大小
- mongo --eval "db.stats().dataSize + db.stats().indexSize"
- # 启用集合TTL索引自动过期数据
- mongo
- // 在MongoDB shell中
- use mydb
- db.collection.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 })
- // 查看TTL索引
- db.collection.getIndexes()
- // 删除过期数据
- db.collection.remove({ "createdAt": { $lt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) } })
- // 压缩集合
- db.collection.runCommand("compact")
- // 清理碎片
- db.repairDatabase()
复制代码
九、总结
在CentOS服务器环境下部署数据库是一个系统性的工程,涉及多个环节和众多细节。本文从准备工作开始,详细介绍了数据库的选择与安装、基本配置、安全设置、性能优化、备份与恢复、监控与维护等关键环节,并提供了一系列实用技巧和常见问题的解决方案。
数据库部署不仅仅是简单的安装和配置,还需要根据实际应用场景和业务需求进行针对性的优化。无论是选择MySQL/MariaDB、PostgreSQL还是MongoDB,都需要综合考虑性能、安全性、可靠性和可维护性等因素。
在实际部署过程中,建议遵循以下最佳实践:
1. 充分规划:在部署前充分评估业务需求,选择合适的数据库类型和版本。
2. 安全第一:始终将安全性放在首位,实施严格的访问控制和数据加密。
3. 性能优化:根据服务器硬件配置和应用特点,合理调整数据库参数。
4. 定期备份:建立完善的备份策略,确保数据安全。
5. 持续监控:实施全面的监控,及时发现并解决问题。
6. 文档记录:详细记录部署过程和配置参数,便于后续维护和故障排查。
通过遵循这些原则和方法,可以在CentOS服务器环境下成功部署高性能、高可用、高安全的数据库系统,为业务应用提供可靠的数据支持。 |
|