资讯动态

MariaDB/MySQL入门指南:安装配置与基础操作

发布时间:2026/10/29 14:50:52 来源:尧图企业网站定制
1. 为什么选择MariaDB/MySQL作为你的第一个数据库在数据驱动的时代数据库已经成为开发者必备的核心技能。作为关系型数据库的代表MySQL和它的分支MariaDB凭借其开源、高性能和易用性成为了全球最受欢迎的数据库系统之一。我第一次接触MySQL是在2008年当时为了搭建一个简单的博客系统从此便与数据库结下了不解之缘。MySQL由瑞典公司MySQL AB开发后被Sun公司收购最终归于Oracle旗下。而MariaDB则是MySQL创始人Michael Widenius在Oracle收购Sun后因担心MySQL的未来而创建的分支项目。两者在语法和功能上高度兼容但MariaDB在性能优化和新特性引入上更为激进。提示对于新项目我个人更推荐使用MariaDB它完全兼容MySQL同时提供了更好的性能和更多创新功能而且避免了Oracle可能带来的商业风险。2. 环境准备与安装指南2.1 选择适合你的安装方式在Ubuntu系统上安装MariaDB/MySQL有多种方式每种方式适合不同的使用场景使用系统包管理器安装最简单sudo apt update sudo apt install mariadb-server这种方式安装的是系统仓库中的稳定版本适合大多数生产环境。源码编译安装最灵活wget https://downloads.mariadb.org/interstitial/mariadb-10.6.7/source/mariadb-10.6.7.tar.gz tar -xvzf mariadb-10.6.7.tar.gz cd mariadb-10.6.7/ cmake . -DCMAKE_INSTALL_PREFIX/usr/local/mariadb make sudo make install源码安装可以自定义编译选项获得最佳性能但过程较为复杂适合高级用户。使用官方仓库安装获取最新版本sudo apt-get install software-properties-common sudo apt-key adv --fetch-keys https://mariadb.org/mariadb_release_signing_key.asc sudo add-apt-repository deb [archamd64,arm64,ppc64el] https://mirrors.aliyun.com/mariadb/repo/10.6/ubuntu focal main sudo apt update sudo apt install mariadb-server2.2 安装后的基本配置安装完成后首次使用前必须运行安全脚本sudo mysql_secure_installation这个脚本会引导你完成以下设置设置root密码生产环境必须设置强密码移除匿名用户提高安全性禁止root远程登录防止暴力破解移除测试数据库减少攻击面重新加载权限表使更改立即生效注意在Ubuntu系统中默认情况下MariaDB使用UNIX auth_socket插件认证root用户这意味着你可以直接使用sudo mysql登录而无需密码。这在开发环境中很方便但在生产环境中应该禁用。3. 数据库基础操作实战3.1 连接数据库的多种方式命令行客户端最常用mysql -u username -p输入密码后即可进入交互式环境。使用管理员权限登录无需密码sudo mysql指定主机和端口连接远程数据库mysql -h hostname -P 3306 -u username -p3.2 数据库和表的创建与管理创建你的第一个数据库CREATE DATABASE my_first_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;选择使用该数据库USE my_first_db;创建第一个表用户表CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash CHAR(60) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINEInnoDB;查看表结构DESCRIBE users;3.3 基本CRUD操作插入数据INSERT INTO users (username, email, password_hash) VALUES (john_doe, johnexample.com, $2y$10$N9qo8uLOickgx2ZMRZoMy.MQRqQz6W6NA);查询数据-- 查询所有用户 SELECT * FROM users; -- 条件查询 SELECT username, email FROM users WHERE id 1; -- 分页查询 SELECT * FROM users ORDER BY created_at DESC LIMIT 10 OFFSET 0;更新数据UPDATE users SET email new_emailexample.com WHERE id 1;删除数据DELETE FROM users WHERE id 1;4. 高级功能与性能优化4.1 存储过程与函数存储过程是预编译的SQL语句集合可以提高性能并减少网络传输创建简单的存储过程DELIMITER // CREATE PROCEDURE get_user_by_id(IN user_id INT) BEGIN SELECT * FROM users WHERE id user_id; END // DELIMITER ;调用存储过程CALL get_user_by_id(1);创建函数计算用户年龄DELIMITER // CREATE FUNCTION calculate_age(birth_date DATE) RETURNS INT DETERMINISTIC BEGIN RETURN TIMESTAMPDIFF(YEAR, birth_date, CURDATE()); END // DELIMITER ;使用函数SELECT username, calculate_age(birth_date) AS age FROM users;4.2 索引优化实战没有索引的数据库就像没有目录的书籍。为users表添加索引-- 单列索引 CREATE INDEX idx_username ON users(username); -- 复合索引常用于多条件查询 CREATE INDEX idx_email_status ON users(email, status); -- 查看表索引 SHOW INDEX FROM users;经验分享我曾经优化过一个查询从5秒降到0.01秒仅仅是因为添加了正确的复合索引。记住索引不是越多越好每个索引都会增加写入开销。只为高频查询条件创建索引。4.3 事务处理与ACID特性事务是数据库操作的逻辑单元具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)START TRANSACTION; -- 转账操作从A账户扣除向B账户增加 UPDATE accounts SET balance balance - 100 WHERE user_id 1; UPDATE accounts SET balance balance 100 WHERE user_id 2; -- 如果执行到这里没有问题 COMMIT; -- 如果出现错误 -- ROLLBACK;5. 安全与备份策略5.1 用户权限管理永远不要使用root账户进行日常操作创建专用用户并授予最小必要权限-- 创建只读用户 CREATE USER report_userlocalhost IDENTIFIED BY strong_password; GRANT SELECT ON my_first_db.* TO report_userlocalhost; -- 创建应用用户只有特定表的CRUD权限 CREATE USER app_user% IDENTIFIED BY another_strong_password; GRANT SELECT, INSERT, UPDATE, DELETE ON my_first_db.users TO app_user%; GRANT SELECT ON my_first_db.products TO app_user%; -- 刷新权限 FLUSH PRIVILEGES;查看用户权限SHOW GRANTS FOR app_user%;5.2 数据库备份与恢复使用mysqldump进行逻辑备份# 备份整个数据库 mysqldump -u root -p --single-transaction --routines --triggers my_first_db backup.sql # 仅备份结构 mysqldump -u root -p --no-data my_first_db schema.sql # 仅备份数据 mysqldump -u root -p --no-create-info my_first_db data.sql恢复数据库mysql -u root -p my_first_db backup.sql二进制日志增量备份-- 查看当前二进制日志状态 SHOW MASTER STATUS; -- 在备份后刷新日志 FLUSH LOGS;灾难恢复经验曾经因为硬盘故障丢失了生产数据库幸好有完整的备份策略每日全备二进制日志增量备份。最终只丢失了不到1分钟的数据。记住没有备份的数据库就像走钢丝没有安全网。6. MySQL与MariaDB的选择与对比6.1 技术特性对比特性MySQL 8.0MariaDB 10.6默认存储引擎InnoDBInnoDB窗口函数支持支持JSON支持完善完善并行复制支持支持更好线程池企业版支持社区版支持动态列不支持支持存储引擎可插拔性一般更强社区活跃度由Oracle主导完全开源社区驱动6.2 迁移注意事项从MySQL迁移到MariaDB通常很平滑因为MariaDB设计为二进制兼容。但需要注意某些MySQL特有功能可能在MariaDB中表现不同企业版特有的功能在MariaDB社区版中不可用使用mysql_upgrade工具升级系统表迁移步骤# 1. 备份MySQL数据库 mysqldump --all-databases full_backup.sql # 2. 卸载MySQL sudo apt remove --purge mysql-server mysql-client # 3. 安装MariaDB sudo apt install mariadb-server # 4. 恢复数据 mysql full_backup.sql # 5. 运行升级工具 sudo mysql_upgrade7. 常见问题排查与性能调优7.1 慢查询分析与优化启用慢查询日志SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1; -- 超过1秒的查询 SET GLOBAL slow_query_log_file /var/log/mysql/mariadb-slow.log;分析慢查询日志mysqldumpslow -s t /var/log/mysql/mariadb-slow.log使用EXPLAIN分析查询EXPLAIN SELECT * FROM users WHERE username LIKE john%;关键指标解读type: 最好到最差依次为 system const eq_ref ref range index ALLpossible_keys: 可能使用的索引key: 实际使用的索引rows: 预估需要检查的行数7.2 连接数问题排查查看当前连接状态SHOW STATUS LIKE Threads_connected; SHOW PROCESSLIST;调整最大连接数在/etc/mysql/mariadb.conf.d/50-server.cnf中[mysqld] max_connections 200实战技巧当遇到Too many connections错误时可以临时增加连接数无需重启SET GLOBAL max_connections 300;但这只是临时解决方案应该找出连接泄漏的根本原因。8. 生产环境最佳实践8.1 配置优化建议关键配置参数根据服务器内存调整[mysqld] innodb_buffer_pool_size 4G # 通常分配70-80%的可用内存 innodb_log_file_size 256M innodb_flush_log_at_trx_commit 1 # 保证持久性对性能有影响 sync_binlog 1 query_cache_type 0 # MySQL 8已移除查询缓存 table_open_cache 40008.2 监控与维护常用监控命令-- 查看运行状态 SHOW ENGINE INNODB STATUS; -- 查看变量设置 SHOW VARIABLES LIKE %buffer%; -- 查看表空间使用情况 SELECT table_schema Database, ROUND(SUM(data_length index_length) / 1024 / 1024, 2) Size (MB) FROM information_schema.tables GROUP BY table_schema;定期维护任务每周检查并优化碎片化严重的表OPTIMIZE TABLE large_table;每月备份并验证备份完整性监控磁盘空间使用情况定期检查错误日志sudo tail -f /var/log/mysql/error.log8.3 高可用方案主从复制-- 在主服务器上 CREATE USER replica_user% IDENTIFIED BY password; GRANT REPLICATION SLAVE ON *.* TO replica_user%; SHOW MASTER STATUS; -- 在从服务器上 CHANGE MASTER TO MASTER_HOSTmaster_ip, MASTER_USERreplica_user, MASTER_PASSWORDpassword, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS123456; START SLAVE;Galera集群MariaDB特有提供真正的多主同步复制自动成员控制自动故障转移需要至少3个节点以获得最佳效果使用ProxySQL实现读写分离将读操作分发到从服务器写操作发送到主服务器自动故障检测和切换在实际项目中我通常会根据业务需求选择不同的方案。对于关键业务系统Galera集群提供了很好的高可用性而对于读多写少的应用主从复制ProxySQL的组合既经济又高效。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑