|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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 检查系统环境
首先,我们需要检查系统的版本和架构:
- # 检查CentOS版本
- cat /etc/redhat-release
- # 检查系统架构
- uname -m
复制代码
2.3 更新系统
在安装MySQL之前,建议先更新系统到最新状态:
- # 更新系统软件包
- sudo yum update -y
复制代码
2.4 检查是否已安装MySQL或MariaDB
CentOS 7默认安装了MariaDB(MySQL的一个分支),如果已安装,需要先卸载:
- # 检查是否已安装MySQL或MariaDB
- rpm -qa | grep -i mysql
- rpm -qa | grep -i mariadb
- # 如果已安装,卸载它们
- sudo yum remove -y mysql-*
- sudo yum remove -y mariadb-*
- # 删除相关配置文件和数据目录
- sudo rm -rf /var/lib/mysql
- sudo rm -rf /etc/my.cnf
- sudo rm -rf /etc/my.cnf.d
复制代码
3. MySQL安装过程
在CentOS上安装MySQL有多种方法,本文将介绍两种最常用的方法:使用YUM仓库安装和从源码编译安装。
3.1 使用YUM仓库安装(推荐)
这是最简单、最推荐的安装方法,适合大多数用户。
MySQL官方提供了YUM仓库,我们需要先添加它:
- # 下载MySQL官方YUM仓库包
- sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
- # 验证是否已成功添加
- sudo yum repolist enabled | grep "mysql.*-community.*"
复制代码
MySQL YUM仓库支持多个MySQL版本的安装。默认情况下,会启用最新的MySQL版本。如果你想安装特定版本,可以手动启用或禁用相应的子仓库:
- # 查看所有可用的MySQL版本
- sudo yum repolist all | grep mysql
- # 禁用MySQL 8.0仓库(如果你想安装MySQL 5.7)
- sudo yum-config-manager --disable mysql80-community
- # 启用MySQL 5.7仓库
- sudo yum-config-manager --enable mysql57-community
- # 验证启用的仓库
- sudo yum repolist enabled | grep mysql
复制代码- # 安装MySQL服务器
- sudo yum install -y mysql-community-server
复制代码- # 启动MySQL服务
- sudo systemctl start mysqld
- # 设置MySQL开机自启
- sudo systemctl enable mysqld
- # 检查MySQL服务状态
- sudo systemctl status mysqld
复制代码
3.2 从源码编译安装
从源码编译安装提供了更大的灵活性,可以根据需要定制功能,但过程更复杂,适合有经验的用户。
- # 安装编译MySQL所需的依赖包
- sudo yum groupinstall -y "Development Tools"
- sudo yum install -y cmake ncurses-devel bison openssl-devel
复制代码- # 创建工作目录
- mkdir -p ~/mysql_source
- cd ~/mysql_source
- # 下载MySQL源码(以MySQL 5.7为例)
- wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.35.tar.gz
- # 解压源码包
- tar -zxvf mysql-5.7.35.tar.gz
- cd mysql-5.7.35
复制代码- # 创建编译目录
- mkdir build
- cd build
- # 配置编译选项
- cmake .. \
- -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
- -DMYSQL_DATADIR=/usr/local/mysql/data \
- -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 \
- -DDEFAULT_CHARSET=utf8mb4 \
- -DDEFAULT_COLLATION=utf8mb4_general_ci \
- -DENABLED_LOCAL_INFILE=1 \
- -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
- -DWITH_BOOST=../boost
复制代码- # 开始编译(这个过程可能需要较长时间,取决于系统性能)
- make -j $(nproc)
- # 安装MySQL
- sudo make install
复制代码- # 创建mysql用户和组
- sudo groupadd mysql
- sudo useradd -r -g mysql -s /bin/false mysql
复制代码- # 创建数据目录
- sudo mkdir -p /usr/local/mysql/data
- sudo chown -R mysql:mysql /usr/local/mysql
- # 初始化数据库
- cd /usr/local/mysql
- sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
复制代码- # 创建MySQL配置文件
- sudo tee /etc/my.cnf > /dev/null <<EOF
- [mysqld]
- basedir=/usr/local/mysql
- datadir=/usr/local/mysql/data
- socket=/tmp/mysql.sock
- user=mysql
- symbolic-links=0
- [mysqld_safe]
- log-error=/var/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- EOF
- # 创建systemd服务文件
- sudo tee /etc/systemd/system/mysqld.service > /dev/null <<EOF
- [Unit]
- Description=MySQL Server
- After=network.target
- [Service]
- User=mysql
- Group=mysql
- ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
- LimitNOFILE = 5000
- Restart=on-failure
- RestartSec=10
- PrivateTmp=true
- [Install]
- WantedBy=multi-user.target
- EOF
- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动MySQL服务
- sudo systemctl start mysqld
- # 设置MySQL开机自启
- sudo systemctl enable mysqld
复制代码
4. MySQL基本配置
4.1 获取初始密码
MySQL 5.7及以上版本在安装后会为root用户生成一个临时密码,我们需要获取这个密码:
- # 获取临时密码
- sudo grep 'temporary password' /var/log/mysqld.log
复制代码
4.2 安全配置
运行MySQL提供的安全配置脚本,设置root密码并进行其他安全设置:
- # 运行安全配置脚本
- sudo mysql_secure_installation
复制代码
这个脚本会引导你完成以下步骤:
1. 输入root用户的当前密码(临时密码)
2. 设置新的root密码
3. 是否移除匿名用户(推荐选择是)
4. 是否禁止root远程登录(根据需求选择,生产环境推荐选择是)
5. 是否移除测试数据库(推荐选择是)
6. 是否重新加载权限表(选择是)
4.3 创建用户和授权
在实际应用中,我们通常不会直接使用root用户,而是创建特定的用户并授予适当的权限:
- # 登录MySQL
- mysql -u root -p
- # 创建新用户
- CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'password';
- # 授予用户所有数据库的所有权限(生产环境不推荐)
- GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'localhost' WITH GRANT OPTION;
- # 授予用户特定数据库的所有权限(推荐)
- GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost';
- # 授予用户特定数据库的特定权限(更安全)
- GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'myuser'@'localhost';
- # 刷新权限
- FLUSH PRIVILEGES;
- # 退出MySQL
- EXIT;
复制代码
4.4 配置远程访问
如果需要从远程主机访问MySQL服务器,需要进行以下配置:
- # 编辑MySQL配置文件
- sudo vi /etc/my.cnf
- # 找到bind-address参数,将其设置为0.0.0.0或注释掉
- # bind-address = 0.0.0.0
- # 重启MySQL服务
- sudo systemctl restart mysqld
- # 创建允许远程访问的用户
- mysql -u root -p
- CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'password';
- GRANT ALL PRIVILEGES ON mydatabase.* TO 'remoteuser'@'%';
- FLUSH PRIVILEGES;
- EXIT;
复制代码
注意:允许远程访问会增加安全风险,请确保设置了强密码,并在防火墙中限制访问。
4.5 防火墙配置
如果系统启用了防火墙,需要开放MySQL端口(默认为3306):
- # 开放MySQL端口
- sudo firewall-cmd --permanent --add-port=3306/tcp
- # 重新加载防火墙规则
- sudo firewall-cmd --reload
- # 检查端口是否已开放
- sudo firewall-cmd --list-ports
复制代码
5. 数据库创建与管理
5.1 创建数据库
- # 登录MySQL
- mysql -u root -p
- # 创建数据库
- CREATE DATABASE mydatabase;
- # 查看所有数据库
- SHOW DATABASES;
- # 选择要使用的数据库
- USE mydatabase;
- # 删除数据库
- DROP DATABASE mydatabase;
复制代码
5.2 创建表
- # 创建表
- CREATE TABLE users (
- id INT AUTO_INCREMENT PRIMARY KEY,
- username VARCHAR(50) NOT NULL,
- email VARCHAR(100) NOT NULL,
- password VARCHAR(100) NOT NULL,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
- # 查看所有表
- SHOW TABLES;
- # 查看表结构
- DESCRIBE users;
- # 删除表
- DROP TABLE users;
复制代码
5.3 数据操作
- # 插入数据
- INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'hashed_password');
- # 查询数据
- SELECT * FROM users;
- SELECT username, email FROM users WHERE id = 1;
- # 更新数据
- UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
- # 删除数据
- DELETE FROM users WHERE id = 1;
复制代码
5.4 数据备份与恢复
- # 备份数据库
- mysqldump -u root -p mydatabase > mydatabase_backup.sql
- # 备份所有数据库
- mysqldump -u root -p --all-databases > all_databases_backup.sql
- # 备份特定表
- mysqldump -u root -p mydatabase users > users_table_backup.sql
- # 恢复数据库
- mysql -u root -p mydatabase < mydatabase_backup.sql
复制代码
6. 性能优化技巧
MySQL的性能优化是一个复杂的过程,涉及多个方面。以下是一些常用的优化技巧。
6.1 配置文件优化
MySQL的配置文件通常位于/etc/my.cnf或/etc/my.cnf.d/目录下。以下是一个适用于一般生产环境的配置示例:
- # 编辑MySQL配置文件
- sudo vi /etc/my.cnf
复制代码- [mysqld]
- # 基本设置
- port = 3306
- socket = /tmp/mysql.sock
- pid-file = /var/run/mysqld/mysqld.pid
- datadir = /var/lib/mysql
- default-storage-engine = InnoDB
- # 字符集设置
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
- # 连接设置
- max_connections = 200
- 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_buffer_pool_instances = 4
- innodb_log_file_size = 512M
- innodb_log_buffer_size = 64M
- innodb_flush_log_at_trx_commit = 2
- innodb_flush_method = O_DIRECT
- innodb_file_per_table = 1
- innodb_io_capacity = 2000
- innodb_io_capacity_max = 4000
- innodb_lru_scan_depth = 1024
- innodb_lock_wait_timeout = 50
- innodb_old_blocks_time = 1000
- innodb_open_files = 2000
- innodb_read_io_threads = 8
- innodb_write_io_threads = 8
- innodb_thread_concurrency = 0
- # MyISAM设置(如果使用MyISAM存储引擎)
- key_buffer_size = 256M
- myisam_sort_buffer_size = 64M
- myisam_max_sort_file_size = 10G
- myisam_repair_threads = 1
- # 查询缓存设置(MySQL 8.0已移除查询缓存)
- query_cache_type = 1
- query_cache_size = 128M
- query_cache_limit = 4M
- # 其他设置
- tmp_table_size = 256M
- max_heap_table_size = 256M
- sort_buffer_size = 4M
- read_buffer_size = 3M
- read_rnd_buffer_size = 4M
- join_buffer_size = 4M
- thread_cache_size = 16
- table_open_cache = 2000
- table_definition_cache = 2000
- # 日志设置
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 2
- log_queries_not_using_indexes = 1
- # 复制设置(如果使用主从复制)
- server-id = 1
- log-bin = mysql-bin
- binlog_format = ROW
- sync_binlog = 0
- expire_logs_days = 7
- max_binlog_size = 1G
复制代码
修改配置文件后,需要重启MySQL服务使配置生效:
- # 重启MySQL服务
- sudo systemctl restart mysqld
复制代码
6.2 索引优化
索引是提高查询性能的关键。以下是一些索引优化的技巧:
- # 创建主键索引
- ALTER TABLE users ADD PRIMARY KEY (id);
- # 创建唯一索引
- ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
- # 创建普通索引
- ALTER TABLE users ADD INDEX idx_username (username);
- # 创建复合索引
- ALTER TABLE orders ADD INDEX idx_user_date (user_id, order_date);
复制代码- # 查看表的索引
- SHOW INDEX FROM users;
- # 分析查询执行计划
- EXPLAIN SELECT * FROM users WHERE username = 'john_doe';
复制代码- # 删除索引
- ALTER TABLE users DROP INDEX idx_username;
复制代码
6.3 查询优化
优化查询语句可以显著提高性能。以下是一些查询优化的技巧:
- -- 不推荐
- SELECT * FROM users;
- -- 推荐
- SELECT id, username, email FROM users;
复制代码- -- 不推荐(可能返回大量数据)
- SELECT * FROM orders;
- -- 推荐
- SELECT * FROM orders LIMIT 100;
复制代码- -- 不推荐(无法使用索引)
- SELECT * FROM users WHERE YEAR(created_at) = 2023;
- -- 推荐
- SELECT * FROM users WHERE created_at >= '2023-01-01' AND created_at < '2024-01-01';
复制代码- -- 不推荐
- SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'active');
- -- 推荐
- SELECT orders.* FROM orders JOIN users ON orders.user_id = users.id WHERE users.status = 'active';
复制代码
6.4 表优化
MySQL支持多种存储引擎,最常用的是InnoDB和MyISAM。
• InnoDB:支持事务、行级锁定、外键,适合高并发、数据完整性要求高的应用。
• MyISAM:不支持事务、表级锁定,适合读密集型应用。
- -- 创建表时指定存储引擎
- CREATE TABLE mytable (
- id INT PRIMARY KEY,
- name VARCHAR(100)
- ) ENGINE=InnoDB;
- -- 修改表的存储引擎
- ALTER TABLE mytable ENGINE=MyISAM;
复制代码
对于大表,可以使用分区来提高查询性能和管理效率。
- -- 创建按范围分区的表
- CREATE TABLE sales (
- id INT AUTO_INCREMENT,
- sale_date DATE NOT NULL,
- customer_id INT NOT NULL,
- amount DECIMAL(10,2) NOT NULL,
- PRIMARY KEY (id, sale_date)
- ) PARTITION BY RANGE (YEAR(sale_date)) (
- PARTITION p2020 VALUES LESS THAN (2021),
- PARTITION p2021 VALUES LESS THAN (2022),
- PARTITION p2022 VALUES LESS THAN (2023),
- PARTITION pmax VALUES LESS THAN MAXVALUE
- );
复制代码- -- 优化表(重组表数据,提高性能)
- OPTIMIZE TABLE users;
- -- 分析表(更新表的统计信息,帮助优化器选择最佳执行计划)
- ANALYZE TABLE users;
- -- 检查表(检查表是否有错误)
- CHECK TABLE users;
- -- 修复表(修复表中的错误)
- REPAIR TABLE users;
复制代码
6.5 服务器优化
MySQL的性能很大程度上取决于可用内存,特别是InnoDB缓冲池大小。确保服务器有足够的内存,并适当分配给MySQL。
使用固态硬盘(SSD)可以显著提高MySQL的I/O性能,特别是对于I/O密集型工作负载。
对于MySQL数据目录,使用适当的文件系统和挂载选项可以提高性能。例如,对于ext4文件系统,可以使用noatime选项来减少磁盘写入:
- # 编辑/etc/fstab文件
- sudo vi /etc/fstab
- # 添加noatime选项
- /dev/sdb1 /var/lib/mysql ext4 defaults,noatime 0 0
- # 重新挂载文件系统
- sudo mount -o remount /var/lib/mysql
复制代码
6.6 监控与分析
慢查询日志可以帮助识别执行时间长的查询,以便进行优化。
- -- 启用慢查询日志
- SET GLOBAL slow_query_log = 'ON';
- SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
- SET GLOBAL long_query_time = 2; -- 记录执行时间超过2秒的查询
- SET GLOBAL log_queries_not_using_indexes = 'ON'; -- 记录不使用索引的查询
复制代码
Performance Schema是MySQL提供的性能监控工具,可以收集详细的性能数据。
- -- 启用Performance Schema
- UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES';
- UPDATE performance_schema.setup_consumers SET ENABLED = 'YES';
- -- 查询最常执行的SQL语句
- SELECT DIGEST_TEXT, COUNT_STAR, SUM_ROWS_EXAMINED, SUM_ROWS_SENT
- FROM performance_schema.events_statements_summary_by_digest
- ORDER BY COUNT_STAR DESC LIMIT 10;
复制代码
这些工具提供了更全面的MySQL监控和管理功能,包括实时性能监控、查询分析、配置建议等。
7. 备份与恢复策略
数据库备份是保障数据安全的重要措施。以下是一些常用的备份与恢复策略。
7.1 逻辑备份
- # 备份单个数据库
- mysqldump -u root -p mydatabase > mydatabase_backup.sql
- # 备份多个数据库
- mysqldump -u root -p --databases mydatabase1 mydatabase2 > databases_backup.sql
- # 备份所有数据库
- mysqldump -u root -p --all-databases > all_databases_backup.sql
- # 备份特定表
- mysqldump -u root -p mydatabase table1 table2 > tables_backup.sql
- # 压缩备份文件
- mysqldump -u root -p mydatabase | gzip > mydatabase_backup.sql.gz
复制代码
mysqlpump是MySQL 5.7引入的新的逻辑备份工具,支持并行备份,速度更快。
- # 备份数据库
- mysqlpump -u root -p mydatabase > mydatabase_backup.sql
- # 并行备份
- mysqlpump -u root -p --parallel-threads=4 mydatabase > mydatabase_backup.sql
复制代码
mydumper是一个第三方工具,支持并行备份,适合大型数据库。
- # 安装mydumper
- sudo yum install -y mydumper
- # 备份数据库
- mydumper -u root -p password -o /backup/mydatabase -B mydatabase
- # 并行备份
- mydumper -u root -p password -o /backup/mydatabase -B mydatabase -t 8
复制代码
7.2 物理备份
XtraBackup是Percona提供的开源热备份工具,支持InnoDB数据库的非阻塞备份。
- # 安装XtraBackup
- sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
- sudo yum install -y percona-xtrabackup-24
- # 创建完整备份
- xtrabackup --backup --target-dir=/backup/full --user=root --password=password
- # 创建增量备份(基于完整备份)
- xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full --user=root --password=password
- # 准备备份
- xtrabackup --prepare --apply-log-only --target-dir=/backup/full
- xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
- # 恢复备份
- xtrabackup --copy-back --target-dir=/backup/full
复制代码
如果你的存储系统支持快照功能(如LVM、ZFS等),可以使用文件系统快照进行备份。
- # 使用LVM快照进行备份
- # 1. 锁定MySQL表
- mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
- # 2. 创建LVM快照
- lvcreate -L 1G -s -n mysql_snap /dev/vg00/mysql
- # 3. 解锁MySQL表
- mysql -u root -p -e "UNLOCK TABLES;"
- # 4. 挂载快照并复制数据
- mkdir /mnt/mysql_snap
- mount /dev/vg00/mysql_snap /mnt/mysql_snap
- rsync -av /mnt/mysql_snap/ /backup/mysql/
- umount /mnt/mysql_snap
- # 5. 删除快照
- lvremove -f /dev/vg00/mysql_snap
复制代码
7.3 自动化备份策略
- # 编辑crontab
- crontab -e
- # 添加以下内容(每天凌晨2点备份数据库)
- 0 2 * * * mysqldump -u root -ppassword mydatabase | gzip > /backup/mydatabase_$(date +\%Y\%m\%d).sql.gz
复制代码
创建一个更完整的备份脚本,包括备份、压缩、保留策略等:
- #!/bin/bash
- # 配置变量
- DB_USER="root"
- DB_PASS="password"
- DB_NAME="mydatabase"
- BACKUP_DIR="/backup/mysql"
- RETENTION_DAYS=30
- DATE=$(date +%Y%m%d_%H%M%S)
- # 创建备份目录
- mkdir -p $BACKUP_DIR
- # 执行备份
- mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
- # 删除旧备份
- find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
- # 记录日志
- echo "Backup completed at $(date)" >> $BACKUP_DIR/backup.log
复制代码
设置脚本可执行并添加到crontab:
- # 设置脚本可执行
- chmod +x /usr/local/bin/mysql_backup.sh
- # 编辑crontab
- crontab -e
- # 添加以下内容(每天凌晨2点执行备份脚本)
- 0 2 * * * /usr/local/bin/mysql_backup.sh
复制代码
7.4 备份验证与恢复演练
定期验证备份的完整性和可恢复性非常重要。
- # 检查备份文件是否存在且不为空
- if [ -s /backup/mydatabase_20230101.sql.gz ]; then
- echo "Backup file exists and is not empty"
- else
- echo "Backup file is missing or empty"
- fi
- # 检查备份文件是否可以解压
- gzip -t /backup/mydatabase_20230101.sql.gz
- if [ $? -eq 0 ]; then
- echo "Backup file is valid"
- else
- echo "Backup file is corrupted"
- fi
复制代码
定期在测试环境中恢复备份,确保备份可用:
- # 创建测试数据库
- mysql -u root -p -e "CREATE DATABASE test_database;"
- # 恢复备份到测试数据库
- gunzip < /backup/mydatabase_20230101.sql.gz | mysql -u root -p test_database
- # 验证恢复的数据
- mysql -u root -p test_database -e "SHOW TABLES;"
- mysql -u root -p test_database -e "SELECT COUNT(*) FROM users;"
- # 删除测试数据库
- mysql -u root -p -e "DROP DATABASE test_database;"
复制代码
8. 常见问题与解决方案
8.1 MySQL服务无法启动
- # 查看MySQL错误日志
- sudo tail -f /var/log/mysqld.log
复制代码- # 检查MySQL数据目录权限
- sudo ls -la /var/lib/mysql
- # 修正权限
- sudo chown -R mysql:mysql /var/lib/mysql
复制代码- # 检查3306端口是否被占用
- sudo netstat -tulnp | grep 3306
- # 如果被占用,可以终止占用进程或更改MySQL端口
复制代码
8.2 连接问题
- # 检查MySQL服务状态
- sudo systemctl status mysqld
- # 检查防火墙设置
- sudo firewall-cmd --list-ports
- # 检查MySQL监听地址
- sudo netstat -tulnp | grep mysqld
复制代码- # 重置root密码
- sudo systemctl stop mysqld
- sudo mysqld_safe --skip-grant-tables &
- mysql -u root
- UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root';
- FLUSH PRIVILEGES;
- EXIT;
- sudo systemctl stop mysqld
- sudo systemctl start mysqld
复制代码
8.3 性能问题
- # 启用慢查询日志
- mysql -u root -p
- SET GLOBAL slow_query_log = 'ON';
- SET GLOBAL long_query_time = 2;
- SET GLOBAL log_queries_not_using_indexes = 'ON';
- # 分析慢查询日志
- mysqldumpslow -s t /var/log/mysql/slow.log
复制代码- # 查看MySQL进程列表
- mysql -u root -p -e "SHOW FULL PROCESSLIST;"
- # 查看服务器状态
- mysql -u root -p -e "SHOW STATUS LIKE 'Threads%';"
- mysql -u root -p -e "SHOW STATUS LIKE 'Connections%';"
- mysql -u root -p -e "SHOW STATUS LIKE 'Innodb%';"
复制代码
8.4 数据损坏
- # 检查表
- mysql -u root -p -e "CHECK TABLE mydatabase.mytable;"
- # 修复表
- mysql -u root -p -e "REPAIR TABLE mydatabase.mytable;"
复制代码- # 使用InnoDB恢复模式
- sudo vi /etc/my.cnf
- # 添加以下配置
- [mysqld]
- innodb_force_recovery = 1
- # 重启MySQL
- sudo systemctl restart mysqld
- # 尝试导出数据
- mysqldump -u root -p mydatabase > mydatabase_backup.sql
- # 恢复正常配置并重启
- sudo vi /etc/my.cnf
- # 删除或注释掉innodb_force_recovery行
- sudo systemctl restart mysqld
复制代码
9. 总结
本文详细介绍了在CentOS系统上部署MySQL数据库的全过程,包括准备工作、安装方法、基本配置、数据库管理、性能优化技巧、备份与恢复策略以及常见问题的解决方案。通过遵循本文的指导,即使是新手也能轻松掌握MySQL数据库的部署和管理。
MySQL数据库的部署和管理是一个持续学习和优化的过程。随着业务需求的变化和技术的发展,你可能需要不断调整和优化你的MySQL配置。希望本文能为你提供一个良好的起点,帮助你在CentOS系统上成功部署和管理MySQL数据库。
最后,记住数据库安全的重要性。始终保持你的MySQL服务器更新,使用强密码,限制网络访问,并定期备份数据。这些最佳实践将帮助你确保数据库的安全和可靠性。 |
|