本文档风哥主要介绍MariaDB的源码编译安装方法及官方推荐参数配置,包括源码下载、编译环境准备、编译安装步骤和参数调优等内容。风哥教程参考MariaDB官方文档Installation Guides和Performance Tuning内容,适合数据库管理员学习和实施。
Part01-基础概念与理论知识
1.1 源码编译概念
源码编译是指从源代码构建软件的过程,相比二进制安装,具有以下优势:
- 可定制性强,可根据需要开启或关闭特定功能
- 可针对特定硬件平台进行优化
- 可获取最新版本的功能
- 更适合需要深度定制的生产环境
1.2 编译环境要求
风哥提示:源码编译需要安装完整的开发环境和依赖包,确保编译过程顺利进行。
1.3 参数配置基础
MariaDB参数配置包括:
- 基本参数:端口、数据目录等
- 性能参数:缓冲区大小、连接数等
- 安全参数:访问控制、加密等
- 存储引擎参数:InnoDB、MyISAM等
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 编译规划
编译规划包括:
- 安装路径:/usr/local/mariadb
- 数据路径:/mariadb/fgdata
- 编译选项:开启必要功能,关闭不需要的功能
- 优化选项:针对硬件平台进行编译优化
2.2 依赖包准备
更多学习教程公众号风哥教程itpux_com
# 安装编译依赖
[root@fgedu.net.cn ~]# yum install -y \
gcc gcc-c++ make cmake \
ncurses-devel bison openssl-devel \
zlib-devel libaio-devel libxml2-devel \
libevent-devel gnutls-devel
# 安装其他依赖
[root@fgedu.net.cn ~]# yum install -y \
perl-Data-Dumper perl-DBI \
perl-DBD-MySQL perl-Time-HiRes
[root@fgedu.net.cn ~]# yum install -y \
gcc gcc-c++ make cmake \
ncurses-devel bison openssl-devel \
zlib-devel libaio-devel libxml2-devel \
libevent-devel gnutls-devel
# 安装其他依赖
[root@fgedu.net.cn ~]# yum install -y \
perl-Data-Dumper perl-DBI \
perl-DBD-MySQL perl-Time-HiRes
2.3 优化策略
编译优化策略:
- 使用-O2或-O3编译优化
- 针对CPU架构进行优化
- 开启必要的存储引擎
- 关闭不需要的功能模块
学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 源码下载与准备
# 下载MariaDB源码
[root@fgedu.net.cn ~]# wget https://downloads.mariadb.org/interstitial/mariadb-10.11.8/source/mariadb-10.11.8.tar.gz
# 解压源码
[root@fgedu.net.cn ~]# tar -zxvf mariadb-10.11.8.tar.gz
[root@fgedu.net.cn ~]# cd mariadb-10.11.8
# 创建用户和组
[root@fgedu.net.cn ~]# groupadd mysql
[root@fgedu.net.cn ~]# useradd -r -g mysql -s /sbin/nologin mysql
# 创建目录结构
[root@fgedu.net.cn ~]# mkdir -p /usr/local/mariadb
[root@fgedu.net.cn ~]# mkdir -p /mariadb/fgdata
[root@fgedu.net.cn ~]# chown -R mysql:mysql /mariadb/
[root@fgedu.net.cn ~]# wget https://downloads.mariadb.org/interstitial/mariadb-10.11.8/source/mariadb-10.11.8.tar.gz
# 解压源码
[root@fgedu.net.cn ~]# tar -zxvf mariadb-10.11.8.tar.gz
[root@fgedu.net.cn ~]# cd mariadb-10.11.8
# 创建用户和组
[root@fgedu.net.cn ~]# groupadd mysql
[root@fgedu.net.cn ~]# useradd -r -g mysql -s /sbin/nologin mysql
# 创建目录结构
[root@fgedu.net.cn ~]# mkdir -p /usr/local/mariadb
[root@fgedu.net.cn ~]# mkdir -p /mariadb/fgdata
[root@fgedu.net.cn ~]# chown -R mysql:mysql /mariadb/
3.2 编译安装步骤
# 配置编译选项
[root@fgedu.net.cn mariadb-10.11.8]# cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \
-DMYSQL_DATADIR=/mariadb/fgdata \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_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_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DCMAKE_BUILD_TYPE=RelWithDebInfo
# 编译
[root@fgedu.net.cn mariadb-10.11.8]# make -j $(nproc)
# 安装
[root@fgedu.net.cn mariadb-10.11.8]# make install
# 初始化数据库
[root@fgedu.net.cn ~]# cd /usr/local/mariadb
[root@fgedu.net.cn mariadb]# ./scripts/mysql_install_db –user=mysql –datadir=/mariadb/fgdata
[root@fgedu.net.cn mariadb-10.11.8]# cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \
-DMYSQL_DATADIR=/mariadb/fgdata \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_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_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DCMAKE_BUILD_TYPE=RelWithDebInfo
# 编译
[root@fgedu.net.cn mariadb-10.11.8]# make -j $(nproc)
# 安装
[root@fgedu.net.cn mariadb-10.11.8]# make install
# 初始化数据库
[root@fgedu.net.cn ~]# cd /usr/local/mariadb
[root@fgedu.net.cn mariadb]# ./scripts/mysql_install_db –user=mysql –datadir=/mariadb/fgdata
3.3 官方推荐参数配置
# 配置my.cnf
[root@fgedu.net.cn ~]# cat > /etc/my.cnf << 'EOF'
[mysqld]
# 基本配置
user = mysql
basedir = /usr/local/mariadb
datadir = /mariadb/fgdata
socket = /tmp/mysql.sock
pid-file = /mariadb/fgdata/mysql.pid
# 官方推荐性能参数
innodb_buffer_pool_size = 8G
innodb_log_file_size = 2G
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_buffer_pool_instances = 8
innodb_thread_concurrency = 16
# 连接配置
max_connections = 2000
max_connect_errors = 10000
wait_timeout = 300
interactive_timeout = 300
# 查询缓存(已废弃,建议关闭)
query_cache_size = 0
query_cache_type = 0
# 其他配置
tmp_table_size = 64M
max_heap_table_size = 64M
table_open_cache = 4096
table_definition_cache = 4096
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
join_buffer_size = 8M
# 安全配置
bind-address = 0.0.0.0
skip-name-resolve
EOF
# 创建systemd服务文件
[root@fgedu.net.cn ~]# cat > /etc/systemd/system/mariadb.service << 'EOF'
[Unit]
Description=MariaDB 10.11.8 database server
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mariadb/bin/mysqld –defaults-file=/etc/my.cnf
ExecStop=/usr/local/mariadb/bin/mysqladmin -u root -p shutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
[root@fgedu.net.cn ~]# systemctl daemon-reload
[root@fgedu.net.cn ~]# systemctl start mariadb
[root@fgedu.net.cn ~]# systemctl enable mariadb
[root@fgedu.net.cn ~]# cat > /etc/my.cnf << 'EOF'
[mysqld]
# 基本配置
user = mysql
basedir = /usr/local/mariadb
datadir = /mariadb/fgdata
socket = /tmp/mysql.sock
pid-file = /mariadb/fgdata/mysql.pid
# 官方推荐性能参数
innodb_buffer_pool_size = 8G
innodb_log_file_size = 2G
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_buffer_pool_instances = 8
innodb_thread_concurrency = 16
# 连接配置
max_connections = 2000
max_connect_errors = 10000
wait_timeout = 300
interactive_timeout = 300
# 查询缓存(已废弃,建议关闭)
query_cache_size = 0
query_cache_type = 0
# 其他配置
tmp_table_size = 64M
max_heap_table_size = 64M
table_open_cache = 4096
table_definition_cache = 4096
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
join_buffer_size = 8M
# 安全配置
bind-address = 0.0.0.0
skip-name-resolve
EOF
# 创建systemd服务文件
[root@fgedu.net.cn ~]# cat > /etc/systemd/system/mariadb.service << 'EOF'
[Unit]
Description=MariaDB 10.11.8 database server
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mariadb/bin/mysqld –defaults-file=/etc/my.cnf
ExecStop=/usr/local/mariadb/bin/mysqladmin -u root -p shutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
[root@fgedu.net.cn ~]# systemctl daemon-reload
[root@fgedu.net.cn ~]# systemctl start mariadb
[root@fgedu.net.cn ~]# systemctl enable mariadb
学习交流加群风哥QQ113257174
Part04-生产案例与实战讲解
4.1 源码编译实战
# 检查编译结果
[root@fgedu.net.cn ~]# ls -la /usr/local/mariadb/
total 48
drwxr-xr-x 13 root root 4096 Apr 7 12:00 .
drwxr-xr-x. 1 root root 4096 Apr 7 11:30 ..
drwxr-xr-x 2 root root 4096 Apr 7 12:00 bin
drwxr-xr-x 3 root root 4096 Apr 7 12:00 docs
drwxr-xr-x 3 root root 4096 Apr 7 12:00 include
drwxr-xr-x 4 root root 4096 Apr 7 12:00 lib
drwxr-xr-x 4 root root 4096 Apr 7 12:00 man
drwxr-xr-x 10 root root 4096 Apr 7 12:00 mysql-test
drwxr-xr-x 2 root root 4096 Apr 7 12:00 scripts
drwxr-xr-x 28 root root 4096 Apr 7 12:00 share
drwxr-xr-x 4 root root 4096 Apr 7 12:00 sql-bench
drwxr-xr-x 3 root root 4096 Apr 7 12:00 support-files
# 检查服务状态
[root@fgedu.net.cn ~]# systemctl status mariadb
● mariadb.service – MariaDB 10.11.8 database server
Loaded: loaded (/etc/systemd/system/mariadb.service;
enabled;
vendor preset: disabled)
Active: active (running) since Mon 2026-04-07 12:10:00 CST;
5min ago
Main PID: 3456 (mysqld)
Status: “Taking your SQL requests now…”
Tasks: 35 (limit: 32768)
Memory: 1.5G
CPU: 3.2s
CGroup: /system.slice/mariadb.service
└─3456 /usr/local/mariadb/bin/mysqld –defaults-file=/etc/my.cnf
Apr 07 12:10:00 fgedu.net.cn systemd[1]: Started MariaDB 10.11.8 database server.
[root@fgedu.net.cn ~]# ls -la /usr/local/mariadb/
total 48
drwxr-xr-x 13 root root 4096 Apr 7 12:00 .
drwxr-xr-x. 1 root root 4096 Apr 7 11:30 ..
drwxr-xr-x 2 root root 4096 Apr 7 12:00 bin
drwxr-xr-x 3 root root 4096 Apr 7 12:00 docs
drwxr-xr-x 3 root root 4096 Apr 7 12:00 include
drwxr-xr-x 4 root root 4096 Apr 7 12:00 lib
drwxr-xr-x 4 root root 4096 Apr 7 12:00 man
drwxr-xr-x 10 root root 4096 Apr 7 12:00 mysql-test
drwxr-xr-x 2 root root 4096 Apr 7 12:00 scripts
drwxr-xr-x 28 root root 4096 Apr 7 12:00 share
drwxr-xr-x 4 root root 4096 Apr 7 12:00 sql-bench
drwxr-xr-x 3 root root 4096 Apr 7 12:00 support-files
# 检查服务状态
[root@fgedu.net.cn ~]# systemctl status mariadb
● mariadb.service – MariaDB 10.11.8 database server
Loaded: loaded (/etc/systemd/system/mariadb.service;
enabled;
vendor preset: disabled)
Active: active (running) since Mon 2026-04-07 12:10:00 CST;
5min ago
Main PID: 3456 (mysqld)
Status: “Taking your SQL requests now…”
Tasks: 35 (limit: 32768)
Memory: 1.5G
CPU: 3.2s
CGroup: /system.slice/mariadb.service
└─3456 /usr/local/mariadb/bin/mysqld –defaults-file=/etc/my.cnf
Apr 07 12:10:00 fgedu.net.cn systemd[1]: Started MariaDB 10.11.8 database server.
4.2 参数调优实战
# 连接MariaDB
[root@fgedu.net.cn ~]# /usr/local/mariadb/bin/mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with;
or \g.
Your MariaDB connection id is 8
Server version: 10.11.8-MariaDB Source distribution
# 查看参数配置
MariaDB [(none)]> SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;
+————————-+————+
| Variable_name | Value |
+————————-+————+
| innodb_buffer_pool_size | 8589934592 |
+————————-+————+
1 row in set (0.00 sec)
MariaDB [(none)]> SHOW VARIABLES LIKE ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 2000 |
+—————–+——-+
1 row in set (0.00 sec)
# 查看状态
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool_%’;
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| Innodb_buffer_pool_dump_status | not started |
| Innodb_buffer_pool_load_status | not started |
| Innodb_buffer_pool_resize_status | not started |
| Innodb_buffer_pool_pages_data | 262144 |
| Innodb_buffer_pool_bytes_data | 4294967296 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 0 |
| Innodb_buffer_pool_pages_free | 262144 |
| Innodb_buffer_pool_pages_misc | 0 |
| Innodb_buffer_pool_pages_total | 524288 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 12345 |
| Innodb_buffer_pool_reads | 123 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 6789 |
+—————————————+————-+
18 rows in set (0.01 sec)
[root@fgedu.net.cn ~]# /usr/local/mariadb/bin/mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with;
or \g.
Your MariaDB connection id is 8
Server version: 10.11.8-MariaDB Source distribution
# 查看参数配置
MariaDB [(none)]> SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;
+————————-+————+
| Variable_name | Value |
+————————-+————+
| innodb_buffer_pool_size | 8589934592 |
+————————-+————+
1 row in set (0.00 sec)
MariaDB [(none)]> SHOW VARIABLES LIKE ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 2000 |
+—————–+——-+
1 row in set (0.00 sec)
# 查看状态
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool_%’;
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| Innodb_buffer_pool_dump_status | not started |
| Innodb_buffer_pool_load_status | not started |
| Innodb_buffer_pool_resize_status | not started |
| Innodb_buffer_pool_pages_data | 262144 |
| Innodb_buffer_pool_bytes_data | 4294967296 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 0 |
| Innodb_buffer_pool_pages_free | 262144 |
| Innodb_buffer_pool_pages_misc | 0 |
| Innodb_buffer_pool_pages_total | 524288 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 12345 |
| Innodb_buffer_pool_reads | 123 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 6789 |
+—————————————+————-+
18 rows in set (0.01 sec)
4.3 性能验证
# 创建测试数据库
MariaDB [(none)]> CREATE DATABASE fgedudb;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> USE fgedudb;
Database changed
# 创建测试表
MariaDB [fgedudb]> CREATE TABLE fgedu_test (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(100),
-> value INT,
-> created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)
# 插入测试数据
MariaDB [fgedudb]> DELIMITER //
MariaDB [fgedudb]> CREATE PROCEDURE insert_large_data()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 200000 DO
INSERT INTO fgedu_test (name, value) VALUES (CONCAT(‘test_’, i), i);
SET i = i + 1;
END WHILE;
END //
MariaDB [fgedudb]> DELIMITER;
MariaDB [fgedudb]> CALL insert_large_data();
Query OK, 1 row affected (8.45 sec)
# 测试查询性能
MariaDB [fgedudb]> EXPLAIN SELECT * FROM fgedu_test WHERE id BETWEEN 100000 AND 100100;
+——+————-+———–+——-+—————+———+———+——+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+——+————-+———–+——-+—————+———+———+——+——+————-+
| 1 | SIMPLE | fgedu_test | range | PRIMARY | PRIMARY | 4 | NULL | 101 | Using where |
+——+————-+———–+——-+—————+———+———+——+——+————-+
1 row in set (0.00 sec)
MariaDB [fgedudb]> SELECT COUNT(*) FROM fgedu_test;
+———-+
| COUNT(*) |
+———-+
| 200000 |
+———-+
1 row in set (0.04 sec)
MariaDB [(none)]> CREATE DATABASE fgedudb;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> USE fgedudb;
Database changed
# 创建测试表
MariaDB [fgedudb]> CREATE TABLE fgedu_test (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(100),
-> value INT,
-> created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)
# 插入测试数据
MariaDB [fgedudb]> DELIMITER //
MariaDB [fgedudb]> CREATE PROCEDURE insert_large_data()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 200000 DO
INSERT INTO fgedu_test (name, value) VALUES (CONCAT(‘test_’, i), i);
SET i = i + 1;
END WHILE;
END //
MariaDB [fgedudb]> DELIMITER;
MariaDB [fgedudb]> CALL insert_large_data();
Query OK, 1 row affected (8.45 sec)
# 测试查询性能
MariaDB [fgedudb]> EXPLAIN SELECT * FROM fgedu_test WHERE id BETWEEN 100000 AND 100100;
+——+————-+———–+——-+—————+———+———+——+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+——+————-+———–+——-+—————+———+———+——+——+————-+
| 1 | SIMPLE | fgedu_test | range | PRIMARY | PRIMARY | 4 | NULL | 101 | Using where |
+——+————-+———–+——-+—————+———+———+——+——+————-+
1 row in set (0.00 sec)
MariaDB [fgedudb]> SELECT COUNT(*) FROM fgedu_test;
+———-+
| COUNT(*) |
+———-+
| 200000 |
+———-+
1 row in set (0.04 sec)
风哥提示:安全开发是防止SQL注入的第一道防线
Part05-风哥经验总结与分享
5.1 编译常见问题与解决
- 依赖包缺失:使用yum安装缺失的依赖
- 编译失败:检查错误信息,针对性解决
- 内存不足:增加系统内存或使用swap
- 磁盘空间不足:确保有足够的临时空间
5.2 参数配置最佳实践
风哥提示:参数配置应根据实际硬件配置和业务负载进行调整,官方推荐值只是参考。
5.3 维护建议
- 定期备份配置文件
- 监控参数变更对性能的影响
- 根据业务增长调整参数
- 定期检查数据库状态
from MariaDB视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
