活动公告

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

详解CentOS系统部署MySQL数据库的全过程及性能优化技巧让新手也能轻松掌握数据库管理

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-17 10:40:05 | 显示全部楼层 |阅读模式

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

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

x
1. 引言

MySQL是世界上最流行的开源关系型数据库管理系统之一,广泛应用于各种Web应用程序和数据驱动的网站。在CentOS系统上部署MySQL数据库是许多系统管理员和开发人员的常见任务。本文将详细介绍在CentOS系统上部署MySQL数据库的全过程,并提供性能优化技巧,帮助新手轻松掌握数据库管理。

2. 准备工作

在开始安装MySQL之前,我们需要做一些准备工作,确保系统环境满足MySQL的运行要求。

2.1 系统要求

• CentOS 7或更高版本(本文以CentOS 7为例)
• 至少512MB RAM(推荐1GB以上)
• 至少1GB可用磁盘空间(根据数据量可能需要更多)
• root或sudo权限

2.2 检查系统环境

首先,我们需要检查系统的版本和架构:
  1. # 检查CentOS版本
  2. cat /etc/redhat-release
  3. # 检查系统架构
  4. uname -m
复制代码

2.3 更新系统

在安装MySQL之前,建议先更新系统到最新状态:
  1. # 更新系统软件包
  2. sudo yum update -y
复制代码

2.4 检查是否已安装MySQL或MariaDB

CentOS 7默认安装了MariaDB(MySQL的一个分支),如果已安装,需要先卸载:
  1. # 检查是否已安装MySQL或MariaDB
  2. rpm -qa | grep -i mysql
  3. rpm -qa | grep -i mariadb
  4. # 如果已安装,卸载它们
  5. sudo yum remove -y mysql-*
  6. sudo yum remove -y mariadb-*
  7. # 删除相关配置文件和数据目录
  8. sudo rm -rf /var/lib/mysql
  9. sudo rm -rf /etc/my.cnf
  10. sudo rm -rf /etc/my.cnf.d
复制代码

3. MySQL安装过程

在CentOS上安装MySQL有多种方法,本文将介绍两种最常用的方法:使用YUM仓库安装和从源码编译安装。

3.1 使用YUM仓库安装(推荐)

这是最简单、最推荐的安装方法,适合大多数用户。

MySQL官方提供了YUM仓库,我们需要先添加它:
  1. # 下载MySQL官方YUM仓库包
  2. sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  3. # 验证是否已成功添加
  4. sudo yum repolist enabled | grep "mysql.*-community.*"
复制代码

MySQL YUM仓库支持多个MySQL版本的安装。默认情况下,会启用最新的MySQL版本。如果你想安装特定版本,可以手动启用或禁用相应的子仓库:
  1. # 查看所有可用的MySQL版本
  2. sudo yum repolist all | grep mysql
  3. # 禁用MySQL 8.0仓库(如果你想安装MySQL 5.7)
  4. sudo yum-config-manager --disable mysql80-community
  5. # 启用MySQL 5.7仓库
  6. sudo yum-config-manager --enable mysql57-community
  7. # 验证启用的仓库
  8. sudo yum repolist enabled | grep mysql
复制代码
  1. # 安装MySQL服务器
  2. sudo yum install -y mysql-community-server
复制代码
  1. # 启动MySQL服务
  2. sudo systemctl start mysqld
  3. # 设置MySQL开机自启
  4. sudo systemctl enable mysqld
  5. # 检查MySQL服务状态
  6. sudo systemctl status mysqld
复制代码

3.2 从源码编译安装

从源码编译安装提供了更大的灵活性,可以根据需要定制功能,但过程更复杂,适合有经验的用户。
  1. # 安装编译MySQL所需的依赖包
  2. sudo yum groupinstall -y "Development Tools"
  3. sudo yum install -y cmake ncurses-devel bison openssl-devel
复制代码
  1. # 创建工作目录
  2. mkdir -p ~/mysql_source
  3. cd ~/mysql_source
  4. # 下载MySQL源码(以MySQL 5.7为例)
  5. wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.35.tar.gz
  6. # 解压源码包
  7. tar -zxvf mysql-5.7.35.tar.gz
  8. cd mysql-5.7.35
复制代码
  1. # 创建编译目录
  2. mkdir build
  3. cd build
  4. # 配置编译选项
  5. cmake .. \
  6. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  7. -DMYSQL_DATADIR=/usr/local/mysql/data \
  8. -DSYSCONFDIR=/etc \
  9. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  10. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
  11. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  12. -DWITH_READLINE=1 \
  13. -DWITH_SSL=system \
  14. -DWITH_ZLIB=system \
  15. -DWITH_LIBWRAP=0 \
  16. -DDEFAULT_CHARSET=utf8mb4 \
  17. -DDEFAULT_COLLATION=utf8mb4_general_ci \
  18. -DENABLED_LOCAL_INFILE=1 \
  19. -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
  20. -DWITH_BOOST=../boost
复制代码
  1. # 开始编译(这个过程可能需要较长时间,取决于系统性能)
  2. make -j $(nproc)
  3. # 安装MySQL
  4. sudo make install
复制代码
  1. # 创建mysql用户和组
  2. sudo groupadd mysql
  3. sudo useradd -r -g mysql -s /bin/false mysql
复制代码
  1. # 创建数据目录
  2. sudo mkdir -p /usr/local/mysql/data
  3. sudo chown -R mysql:mysql /usr/local/mysql
  4. # 初始化数据库
  5. cd /usr/local/mysql
  6. sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
复制代码
  1. # 创建MySQL配置文件
  2. sudo tee /etc/my.cnf > /dev/null <<EOF
  3. [mysqld]
  4. basedir=/usr/local/mysql
  5. datadir=/usr/local/mysql/data
  6. socket=/tmp/mysql.sock
  7. user=mysql
  8. symbolic-links=0
  9. [mysqld_safe]
  10. log-error=/var/log/mysqld.log
  11. pid-file=/var/run/mysqld/mysqld.pid
  12. EOF
  13. # 创建systemd服务文件
  14. sudo tee /etc/systemd/system/mysqld.service > /dev/null <<EOF
  15. [Unit]
  16. Description=MySQL Server
  17. After=network.target
  18. [Service]
  19. User=mysql
  20. Group=mysql
  21. ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
  22. LimitNOFILE = 5000
  23. Restart=on-failure
  24. RestartSec=10
  25. PrivateTmp=true
  26. [Install]
  27. WantedBy=multi-user.target
  28. EOF
  29. # 重新加载systemd配置
  30. sudo systemctl daemon-reload
  31. # 启动MySQL服务
  32. sudo systemctl start mysqld
  33. # 设置MySQL开机自启
  34. sudo systemctl enable mysqld
复制代码

4. MySQL基本配置

4.1 获取初始密码

MySQL 5.7及以上版本在安装后会为root用户生成一个临时密码,我们需要获取这个密码:
  1. # 获取临时密码
  2. sudo grep 'temporary password' /var/log/mysqld.log
复制代码

4.2 安全配置

运行MySQL提供的安全配置脚本,设置root密码并进行其他安全设置:
  1. # 运行安全配置脚本
  2. sudo mysql_secure_installation
复制代码

这个脚本会引导你完成以下步骤:

1. 输入root用户的当前密码(临时密码)
2. 设置新的root密码
3. 是否移除匿名用户(推荐选择是)
4. 是否禁止root远程登录(根据需求选择,生产环境推荐选择是)
5. 是否移除测试数据库(推荐选择是)
6. 是否重新加载权限表(选择是)

4.3 创建用户和授权

在实际应用中,我们通常不会直接使用root用户,而是创建特定的用户并授予适当的权限:
  1. # 登录MySQL
  2. mysql -u root -p
  3. # 创建新用户
  4. CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'password';
  5. # 授予用户所有数据库的所有权限(生产环境不推荐)
  6. GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'localhost' WITH GRANT OPTION;
  7. # 授予用户特定数据库的所有权限(推荐)
  8. GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost';
  9. # 授予用户特定数据库的特定权限(更安全)
  10. GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'myuser'@'localhost';
  11. # 刷新权限
  12. FLUSH PRIVILEGES;
  13. # 退出MySQL
  14. EXIT;
复制代码

4.4 配置远程访问

如果需要从远程主机访问MySQL服务器,需要进行以下配置:
  1. # 编辑MySQL配置文件
  2. sudo vi /etc/my.cnf
  3. # 找到bind-address参数,将其设置为0.0.0.0或注释掉
  4. # bind-address = 0.0.0.0
  5. # 重启MySQL服务
  6. sudo systemctl restart mysqld
  7. # 创建允许远程访问的用户
  8. mysql -u root -p
  9. CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'password';
  10. GRANT ALL PRIVILEGES ON mydatabase.* TO 'remoteuser'@'%';
  11. FLUSH PRIVILEGES;
  12. EXIT;
复制代码

注意:允许远程访问会增加安全风险,请确保设置了强密码,并在防火墙中限制访问。

4.5 防火墙配置

如果系统启用了防火墙,需要开放MySQL端口(默认为3306):
  1. # 开放MySQL端口
  2. sudo firewall-cmd --permanent --add-port=3306/tcp
  3. # 重新加载防火墙规则
  4. sudo firewall-cmd --reload
  5. # 检查端口是否已开放
  6. sudo firewall-cmd --list-ports
复制代码

5. 数据库创建与管理

5.1 创建数据库
  1. # 登录MySQL
  2. mysql -u root -p
  3. # 创建数据库
  4. CREATE DATABASE mydatabase;
  5. # 查看所有数据库
  6. SHOW DATABASES;
  7. # 选择要使用的数据库
  8. USE mydatabase;
  9. # 删除数据库
  10. DROP DATABASE mydatabase;
复制代码

5.2 创建表
  1. # 创建表
  2. CREATE TABLE users (
  3.     id INT AUTO_INCREMENT PRIMARY KEY,
  4.     username VARCHAR(50) NOT NULL,
  5.     email VARCHAR(100) NOT NULL,
  6.     password VARCHAR(100) NOT NULL,
  7.     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  8. );
  9. # 查看所有表
  10. SHOW TABLES;
  11. # 查看表结构
  12. DESCRIBE users;
  13. # 删除表
  14. DROP TABLE users;
复制代码

5.3 数据操作
  1. # 插入数据
  2. INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'hashed_password');
  3. # 查询数据
  4. SELECT * FROM users;
  5. SELECT username, email FROM users WHERE id = 1;
  6. # 更新数据
  7. UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
  8. # 删除数据
  9. DELETE FROM users WHERE id = 1;
复制代码

5.4 数据备份与恢复
  1. # 备份数据库
  2. mysqldump -u root -p mydatabase > mydatabase_backup.sql
  3. # 备份所有数据库
  4. mysqldump -u root -p --all-databases > all_databases_backup.sql
  5. # 备份特定表
  6. mysqldump -u root -p mydatabase users > users_table_backup.sql
  7. # 恢复数据库
  8. mysql -u root -p mydatabase < mydatabase_backup.sql
复制代码

6. 性能优化技巧

MySQL的性能优化是一个复杂的过程,涉及多个方面。以下是一些常用的优化技巧。

6.1 配置文件优化

MySQL的配置文件通常位于/etc/my.cnf或/etc/my.cnf.d/目录下。以下是一个适用于一般生产环境的配置示例:
  1. # 编辑MySQL配置文件
  2. sudo vi /etc/my.cnf
复制代码
  1. [mysqld]
  2. # 基本设置
  3. port = 3306
  4. socket = /tmp/mysql.sock
  5. pid-file = /var/run/mysqld/mysqld.pid
  6. datadir = /var/lib/mysql
  7. default-storage-engine = InnoDB
  8. # 字符集设置
  9. character-set-server = utf8mb4
  10. collation-server = utf8mb4_unicode_ci
  11. # 连接设置
  12. max_connections = 200
  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_buffer_pool_instances = 4
  21. innodb_log_file_size = 512M
  22. innodb_log_buffer_size = 64M
  23. innodb_flush_log_at_trx_commit = 2
  24. innodb_flush_method = O_DIRECT
  25. innodb_file_per_table = 1
  26. innodb_io_capacity = 2000
  27. innodb_io_capacity_max = 4000
  28. innodb_lru_scan_depth = 1024
  29. innodb_lock_wait_timeout = 50
  30. innodb_old_blocks_time = 1000
  31. innodb_open_files = 2000
  32. innodb_read_io_threads = 8
  33. innodb_write_io_threads = 8
  34. innodb_thread_concurrency = 0
  35. # MyISAM设置(如果使用MyISAM存储引擎)
  36. key_buffer_size = 256M
  37. myisam_sort_buffer_size = 64M
  38. myisam_max_sort_file_size = 10G
  39. myisam_repair_threads = 1
  40. # 查询缓存设置(MySQL 8.0已移除查询缓存)
  41. query_cache_type = 1
  42. query_cache_size = 128M
  43. query_cache_limit = 4M
  44. # 其他设置
  45. tmp_table_size = 256M
  46. max_heap_table_size = 256M
  47. sort_buffer_size = 4M
  48. read_buffer_size = 3M
  49. read_rnd_buffer_size = 4M
  50. join_buffer_size = 4M
  51. thread_cache_size = 16
  52. table_open_cache = 2000
  53. table_definition_cache = 2000
  54. # 日志设置
  55. slow_query_log = 1
  56. slow_query_log_file = /var/log/mysql/slow.log
  57. long_query_time = 2
  58. log_queries_not_using_indexes = 1
  59. # 复制设置(如果使用主从复制)
  60. server-id = 1
  61. log-bin = mysql-bin
  62. binlog_format = ROW
  63. sync_binlog = 0
  64. expire_logs_days = 7
  65. max_binlog_size = 1G
复制代码

修改配置文件后,需要重启MySQL服务使配置生效:
  1. # 重启MySQL服务
  2. sudo systemctl restart mysqld
复制代码

6.2 索引优化

索引是提高查询性能的关键。以下是一些索引优化的技巧:
  1. # 创建主键索引
  2. ALTER TABLE users ADD PRIMARY KEY (id);
  3. # 创建唯一索引
  4. ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
  5. # 创建普通索引
  6. ALTER TABLE users ADD INDEX idx_username (username);
  7. # 创建复合索引
  8. ALTER TABLE orders ADD INDEX idx_user_date (user_id, order_date);
复制代码
  1. # 查看表的索引
  2. SHOW INDEX FROM users;
  3. # 分析查询执行计划
  4. EXPLAIN SELECT * FROM users WHERE username = 'john_doe';
复制代码
  1. # 删除索引
  2. ALTER TABLE users DROP INDEX idx_username;
复制代码

6.3 查询优化

优化查询语句可以显著提高性能。以下是一些查询优化的技巧:
  1. -- 不推荐
  2. SELECT * FROM users;
  3. -- 推荐
  4. SELECT id, username, email FROM users;
复制代码
  1. -- 不推荐(可能返回大量数据)
  2. SELECT * FROM orders;
  3. -- 推荐
  4. SELECT * FROM orders LIMIT 100;
复制代码
  1. -- 不推荐(无法使用索引)
  2. SELECT * FROM users WHERE YEAR(created_at) = 2023;
  3. -- 推荐
  4. SELECT * FROM users WHERE created_at >= '2023-01-01' AND created_at < '2024-01-01';
复制代码
  1. -- 不推荐
  2. SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'active');
  3. -- 推荐
  4. SELECT orders.* FROM orders JOIN users ON orders.user_id = users.id WHERE users.status = 'active';
复制代码

6.4 表优化

MySQL支持多种存储引擎,最常用的是InnoDB和MyISAM。

• InnoDB:支持事务、行级锁定、外键,适合高并发、数据完整性要求高的应用。
• MyISAM:不支持事务、表级锁定,适合读密集型应用。
  1. -- 创建表时指定存储引擎
  2. CREATE TABLE mytable (
  3.     id INT PRIMARY KEY,
  4.     name VARCHAR(100)
  5. ) ENGINE=InnoDB;
  6. -- 修改表的存储引擎
  7. ALTER TABLE mytable ENGINE=MyISAM;
复制代码

对于大表,可以使用分区来提高查询性能和管理效率。
  1. -- 创建按范围分区的表
  2. CREATE TABLE sales (
  3.     id INT AUTO_INCREMENT,
  4.     sale_date DATE NOT NULL,
  5.     customer_id INT NOT NULL,
  6.     amount DECIMAL(10,2) NOT NULL,
  7.     PRIMARY KEY (id, sale_date)
  8. ) PARTITION BY RANGE (YEAR(sale_date)) (
  9.     PARTITION p2020 VALUES LESS THAN (2021),
  10.     PARTITION p2021 VALUES LESS THAN (2022),
  11.     PARTITION p2022 VALUES LESS THAN (2023),
  12.     PARTITION pmax VALUES LESS THAN MAXVALUE
  13. );
复制代码
  1. -- 优化表(重组表数据,提高性能)
  2. OPTIMIZE TABLE users;
  3. -- 分析表(更新表的统计信息,帮助优化器选择最佳执行计划)
  4. ANALYZE TABLE users;
  5. -- 检查表(检查表是否有错误)
  6. CHECK TABLE users;
  7. -- 修复表(修复表中的错误)
  8. REPAIR TABLE users;
复制代码

6.5 服务器优化

MySQL的性能很大程度上取决于可用内存,特别是InnoDB缓冲池大小。确保服务器有足够的内存,并适当分配给MySQL。

使用固态硬盘(SSD)可以显著提高MySQL的I/O性能,特别是对于I/O密集型工作负载。

对于MySQL数据目录,使用适当的文件系统和挂载选项可以提高性能。例如,对于ext4文件系统,可以使用noatime选项来减少磁盘写入:
  1. # 编辑/etc/fstab文件
  2. sudo vi /etc/fstab
  3. # 添加noatime选项
  4. /dev/sdb1 /var/lib/mysql ext4 defaults,noatime 0 0
  5. # 重新挂载文件系统
  6. sudo mount -o remount /var/lib/mysql
复制代码

6.6 监控与分析

慢查询日志可以帮助识别执行时间长的查询,以便进行优化。
  1. -- 启用慢查询日志
  2. SET GLOBAL slow_query_log = 'ON';
  3. SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
  4. SET GLOBAL long_query_time = 2;  -- 记录执行时间超过2秒的查询
  5. SET GLOBAL log_queries_not_using_indexes = 'ON';  -- 记录不使用索引的查询
复制代码

Performance Schema是MySQL提供的性能监控工具,可以收集详细的性能数据。
  1. -- 启用Performance Schema
  2. UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES';
  3. UPDATE performance_schema.setup_consumers SET ENABLED = 'YES';
  4. -- 查询最常执行的SQL语句
  5. SELECT DIGEST_TEXT, COUNT_STAR, SUM_ROWS_EXAMINED, SUM_ROWS_SENT
  6. FROM performance_schema.events_statements_summary_by_digest
  7. ORDER BY COUNT_STAR DESC LIMIT 10;
复制代码

这些工具提供了更全面的MySQL监控和管理功能,包括实时性能监控、查询分析、配置建议等。

7. 备份与恢复策略

数据库备份是保障数据安全的重要措施。以下是一些常用的备份与恢复策略。

7.1 逻辑备份
  1. # 备份单个数据库
  2. mysqldump -u root -p mydatabase > mydatabase_backup.sql
  3. # 备份多个数据库
  4. mysqldump -u root -p --databases mydatabase1 mydatabase2 > databases_backup.sql
  5. # 备份所有数据库
  6. mysqldump -u root -p --all-databases > all_databases_backup.sql
  7. # 备份特定表
  8. mysqldump -u root -p mydatabase table1 table2 > tables_backup.sql
  9. # 压缩备份文件
  10. mysqldump -u root -p mydatabase | gzip > mydatabase_backup.sql.gz
复制代码

mysqlpump是MySQL 5.7引入的新的逻辑备份工具,支持并行备份,速度更快。
  1. # 备份数据库
  2. mysqlpump -u root -p mydatabase > mydatabase_backup.sql
  3. # 并行备份
  4. mysqlpump -u root -p --parallel-threads=4 mydatabase > mydatabase_backup.sql
复制代码

mydumper是一个第三方工具,支持并行备份,适合大型数据库。
  1. # 安装mydumper
  2. sudo yum install -y mydumper
  3. # 备份数据库
  4. mydumper -u root -p password -o /backup/mydatabase -B mydatabase
  5. # 并行备份
  6. mydumper -u root -p password -o /backup/mydatabase -B mydatabase -t 8
复制代码

7.2 物理备份

XtraBackup是Percona提供的开源热备份工具,支持InnoDB数据库的非阻塞备份。
  1. # 安装XtraBackup
  2. sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
  3. sudo yum install -y percona-xtrabackup-24
  4. # 创建完整备份
  5. xtrabackup --backup --target-dir=/backup/full --user=root --password=password
  6. # 创建增量备份(基于完整备份)
  7. xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full --user=root --password=password
  8. # 准备备份
  9. xtrabackup --prepare --apply-log-only --target-dir=/backup/full
  10. xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
  11. # 恢复备份
  12. xtrabackup --copy-back --target-dir=/backup/full
复制代码

如果你的存储系统支持快照功能(如LVM、ZFS等),可以使用文件系统快照进行备份。
  1. # 使用LVM快照进行备份
  2. # 1. 锁定MySQL表
  3. mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
  4. # 2. 创建LVM快照
  5. lvcreate -L 1G -s -n mysql_snap /dev/vg00/mysql
  6. # 3. 解锁MySQL表
  7. mysql -u root -p -e "UNLOCK TABLES;"
  8. # 4. 挂载快照并复制数据
  9. mkdir /mnt/mysql_snap
  10. mount /dev/vg00/mysql_snap /mnt/mysql_snap
  11. rsync -av /mnt/mysql_snap/ /backup/mysql/
  12. umount /mnt/mysql_snap
  13. # 5. 删除快照
  14. lvremove -f /dev/vg00/mysql_snap
复制代码

7.3 自动化备份策略
  1. # 编辑crontab
  2. crontab -e
  3. # 添加以下内容(每天凌晨2点备份数据库)
  4. 0 2 * * * mysqldump -u root -ppassword mydatabase | gzip > /backup/mydatabase_$(date +\%Y\%m\%d).sql.gz
复制代码

创建一个更完整的备份脚本,包括备份、压缩、保留策略等:
  1. #!/bin/bash
  2. # 配置变量
  3. DB_USER="root"
  4. DB_PASS="password"
  5. DB_NAME="mydatabase"
  6. BACKUP_DIR="/backup/mysql"
  7. RETENTION_DAYS=30
  8. DATE=$(date +%Y%m%d_%H%M%S)
  9. # 创建备份目录
  10. mkdir -p $BACKUP_DIR
  11. # 执行备份
  12. mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
  13. # 删除旧备份
  14. find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
  15. # 记录日志
  16. echo "Backup completed at $(date)" >> $BACKUP_DIR/backup.log
复制代码

设置脚本可执行并添加到crontab:
  1. # 设置脚本可执行
  2. chmod +x /usr/local/bin/mysql_backup.sh
  3. # 编辑crontab
  4. crontab -e
  5. # 添加以下内容(每天凌晨2点执行备份脚本)
  6. 0 2 * * * /usr/local/bin/mysql_backup.sh
复制代码

7.4 备份验证与恢复演练

定期验证备份的完整性和可恢复性非常重要。
  1. # 检查备份文件是否存在且不为空
  2. if [ -s /backup/mydatabase_20230101.sql.gz ]; then
  3.     echo "Backup file exists and is not empty"
  4. else
  5.     echo "Backup file is missing or empty"
  6. fi
  7. # 检查备份文件是否可以解压
  8. gzip -t /backup/mydatabase_20230101.sql.gz
  9. if [ $? -eq 0 ]; then
  10.     echo "Backup file is valid"
  11. else
  12.     echo "Backup file is corrupted"
  13. fi
复制代码

定期在测试环境中恢复备份,确保备份可用:
  1. # 创建测试数据库
  2. mysql -u root -p -e "CREATE DATABASE test_database;"
  3. # 恢复备份到测试数据库
  4. gunzip < /backup/mydatabase_20230101.sql.gz | mysql -u root -p test_database
  5. # 验证恢复的数据
  6. mysql -u root -p test_database -e "SHOW TABLES;"
  7. mysql -u root -p test_database -e "SELECT COUNT(*) FROM users;"
  8. # 删除测试数据库
  9. mysql -u root -p -e "DROP DATABASE test_database;"
复制代码

8. 常见问题与解决方案

8.1 MySQL服务无法启动
  1. # 查看MySQL错误日志
  2. sudo tail -f /var/log/mysqld.log
复制代码
  1. # 检查MySQL数据目录权限
  2. sudo ls -la /var/lib/mysql
  3. # 修正权限
  4. sudo chown -R mysql:mysql /var/lib/mysql
复制代码
  1. # 检查3306端口是否被占用
  2. sudo netstat -tulnp | grep 3306
  3. # 如果被占用,可以终止占用进程或更改MySQL端口
复制代码

8.2 连接问题
  1. # 检查MySQL服务状态
  2. sudo systemctl status mysqld
  3. # 检查防火墙设置
  4. sudo firewall-cmd --list-ports
  5. # 检查MySQL监听地址
  6. sudo netstat -tulnp | grep mysqld
复制代码
  1. # 重置root密码
  2. sudo systemctl stop mysqld
  3. sudo mysqld_safe --skip-grant-tables &
  4. mysql -u root
  5. UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root';
  6. FLUSH PRIVILEGES;
  7. EXIT;
  8. sudo systemctl stop mysqld
  9. sudo systemctl start mysqld
复制代码

8.3 性能问题
  1. # 启用慢查询日志
  2. mysql -u root -p
  3. SET GLOBAL slow_query_log = 'ON';
  4. SET GLOBAL long_query_time = 2;
  5. SET GLOBAL log_queries_not_using_indexes = 'ON';
  6. # 分析慢查询日志
  7. mysqldumpslow -s t /var/log/mysql/slow.log
复制代码
  1. # 查看MySQL进程列表
  2. mysql -u root -p -e "SHOW FULL PROCESSLIST;"
  3. # 查看服务器状态
  4. mysql -u root -p -e "SHOW STATUS LIKE 'Threads%';"
  5. mysql -u root -p -e "SHOW STATUS LIKE 'Connections%';"
  6. mysql -u root -p -e "SHOW STATUS LIKE 'Innodb%';"
复制代码

8.4 数据损坏
  1. # 检查表
  2. mysql -u root -p -e "CHECK TABLE mydatabase.mytable;"
  3. # 修复表
  4. mysql -u root -p -e "REPAIR TABLE mydatabase.mytable;"
复制代码
  1. # 使用InnoDB恢复模式
  2. sudo vi /etc/my.cnf
  3. # 添加以下配置
  4. [mysqld]
  5. innodb_force_recovery = 1
  6. # 重启MySQL
  7. sudo systemctl restart mysqld
  8. # 尝试导出数据
  9. mysqldump -u root -p mydatabase > mydatabase_backup.sql
  10. # 恢复正常配置并重启
  11. sudo vi /etc/my.cnf
  12. # 删除或注释掉innodb_force_recovery行
  13. sudo systemctl restart mysqld
复制代码

9. 总结

本文详细介绍了在CentOS系统上部署MySQL数据库的全过程,包括准备工作、安装方法、基本配置、数据库管理、性能优化技巧、备份与恢复策略以及常见问题的解决方案。通过遵循本文的指导,即使是新手也能轻松掌握MySQL数据库的部署和管理。

MySQL数据库的部署和管理是一个持续学习和优化的过程。随着业务需求的变化和技术的发展,你可能需要不断调整和优化你的MySQL配置。希望本文能为你提供一个良好的起点,帮助你在CentOS系统上成功部署和管理MySQL数据库。

最后,记住数据库安全的重要性。始终保持你的MySQL服务器更新,使用强密码,限制网络访问,并定期备份数据。这些最佳实践将帮助你确保数据库的安全和可靠性。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

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

本版积分规则