部署MariaDB 数据库搭建
MeteorCat这里主要采用 MariaDB 作为主要数据库选择, 且内部系统采用 Debian 系的服务器来利用 Apt 进行源安装.
不涉及所有手动编译, 手动编译很多人直接都不写系统脚本让系统托管, 所以尽量能用官方源托管就利用官方源, 当然如果能够自己手动配置本地源更好.
重要: 如果完全不懂系统脚本编写, 切忌不要抄网上所有自己手动编译的教程, 直接 touch 后台托管危害是十分大的.
源安装命令
一般 Linux 发行版都内置了 MariaDB 的系统源仓库, 如果没有的需要配置仓库文件( 这个问题基本集中在 RHEL 系的服务器 ).
这里可以参考官方文档配置: 官方文档
这里直接配置 Debian11 的源( MariaDB 10.7 ):
1 2 3
| sudo apt-get install -y software-properties-common dirmngr apt-transport-https sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc' sudo add-apt-repository 'deb [arch=amd64,i386,arm64,ppc64el] https://mirrors.aliyun.com/mariadb/repo/10.7/debian bullseye main'
|
此时源配置已经完成, 就可以准备安装服务:
1 2
| sudo apt-get -y update sudo apt-get -y install mariadb-server
|
服务会自动配置到系统之中, 直接采用系统去调取服务:
1 2 3 4
| sudo systemctl status mariadb.service sudo systemctl start mariadb.service sudo netstat -tulpn|grep -E 'mysql|3306' sudo systemctl enable mariadb.service
|
没有其他报错信息, 现在系统服务已经挂起, 后续就是配置账号权限.
注意默认监听端口为 3306
账号配置
目前服务器虽然成功挂起, 但是还是需要配置内部的管理账号, 同时这里默认 root 账号管理.
这里需要设置 root 账号可以被外部其他客户端远程访问( 正式环境不允许 ), 并且创建 api 数据库和账号用于单独管理.
官方已经自带了初始化脚本命令:
1 2 3 4 5 6 7 8 9
| sudo mysql_secure_installation
|
一切完成之后就完成配置, 这里需要说明数据库账号验证体系 unix_socket 和 native:
unix_socket: 只允许本地 unix_domain 方式来访问而非 TCP 方式, 这里方式默认是无法进行远程通信, 只允许对
xxx.socket 进行访问, 安全性最高但是不利于集群读写负载.
native: 常用的配置方式, 采用 TCP + 账号密码|证书访问模式.
如果开发环境需要的就是 root 账号切换成 native 方式方便其他客户端进行访问.
这里直接登录数据库查看目前配置:
后续在数据库内部查看配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| select Host, User, plugin from mysql.user; # 查看目前的用户 # 这里默认切换是 native 访问模式: #+ #| Host | User | plugin | #+ #| localhost | mariadb.sys | mysql_native_password | #| localhost | root | mysql_native_password | #| localhost | mysql | mysql_native_password | #+ # 之后就是创建远程管理账户, 这里密码最好采用 MD5 加密之后处理 CREATE USER meteorcat IDENTIFIED BY 'cc6d8ee8b4b1c5696e5dbcb82e6329ff'; # 创建之后账号是无法直接使用的, 需要对账号进行授权(增删改查切换库等权限), 密码基本上保持上面一致 GRANT ALL PRIVILEGES ON *.* TO 'meteorcat'@'%' IDENTIFIED BY 'cc6d8ee8b4b1c5696e5dbcb82e6329ff' WITH GRANT OPTION; # 完成之后重新刷新权限即可 FLUSH PRIVILEGES;
|
之后就可以进行权限连接访问, 这里提供命令行技巧确认是否联通:
1 2
| mysql -h 192.168.0.8 -umeteorcat -p
|
如果直接访问到这里也没办法访问, 那么最好查看下是否系统强制只允许 127.0.0.1 访问:
1 2 3
| mysqladmin variables |grep 'bind_address'
|
如果只允许 127.0.0.1 访问, 这时候就需要开放公网/局域网进行访问( 这里采用公网暴露方式, 正式一般都是设置内网局域网 ):
1 2 3 4 5 6 7 8 9
| sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 0.0.0.0
sudo systemctl restart mariadb.service
|
如果 Window 系统想访问建议安装官方提供的会话管理器 - HeidiSQL
基本上这样就能创建允许远程维护的系统 MariaDB 管理账号.
性能调优
建议依据服务器配置来调整, 不要盲目进行配置, 以下配置有些需要审慎开启都会进行标注说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| [mysqld]
pid-file = /run/mysqld/mysqld.pid basedir = /usr tmpdir = /tmp
datadir = /var/lib/mysql
skip-name-resolve
bind-address = 0.0.0.0
character_set_server = utf8mb4 collation-server = utf8mb4_unicode_ci
default-storage-engine = InnoDB
back_log = 256
max_connections = 2048
key_buffer_size = 97M
innodb_buffer_pool_size = 768M
innodb_log_buffer_size = 8M
query_cache_size = 32M
read_buffer_size = 2M
sort_buffer_size = 2M
tmp_table_size = 16M
table_open_cache = 512
slow_query_log = On slow_query_log_file = mariadb_slow_query.log log_queries_not_using_indexes = On
|
以上就是比较推荐设置的系统调优值, 剩下的最好认真学习运维和数据库知识再去进行微调, 内部涉及很多知识点.
备份与还原
官方默认已经提供的系统导出工具, 但是这里需要说下导出细节:
- 不要在请求热门时间进行导出, 一般采用凌晨三四点这段冷门时间导出最佳.
- 不要保存同个磁盘, 如果云服务器建议扩展第二硬盘来保存快照备份.
- 千万注意硬盘容量必须是大于 (数据表大小 * 80%) + 数据表大小; 因为会先导出表结构, 之后数据最后打包成压缩压缩包后删除多余文件,
其中生成的文件特别多.
这里没有进行扩展盘所以采用本地备份, 实际上最好采用扩展盘放置.
常见命令导出格式如下:
1 2 3 4 5 6 7
|
mysqldump -u 数据库账号 -p [数据库密码,可有可无] --add-drop-table --default-character-set=utf8mb4 数据库名 > 导出文件名.sql
mysqldump -u 数据库账号 -p --add-drop-table --default-character-set=utf8mb4 数据库名 | gzip > 导出文件名.gz
|
导出数据单位是以库单位, 所以这里只列举单个数据库导出而不列举其他, 这里测试上面导出系统 mysql 数据库:
1 2 3 4 5
| mysqldump -u meteorcat -p'cc6d8ee8b4b1c5696e5dbcb82e6329ff' --add-drop-table --default-character-set=utf8mb4 mysql > /tmp/mysql.sql
mysqldump -u meteorcat -p'cc6d8ee8b4b1c5696e5dbcb82e6329ff' --add-drop-table --default-character-set=utf8mb4 mysql | gzip > /tmp/mysql.gz
|
后续就是还原数据库的数据, 直接命令行执行即可:
1 2 3 4 5
| mysql -u 数据库账号 -p [数据库密码,可有可无] --default-character-set=utf8mb4 数据库名 < 导出文件名.sql
gunzip < 导出文件名.gz | mysql -u 数据库账号 -p [数据库密码,可有可无] --default-character-set=utf8mb4 数据库名
|
这里采用上面备份的数据进行还原处理:
1 2 3 4 5
| mysql -u meteorcat -p'cc6d8ee8b4b1c5696e5dbcb82e6329ff' --default-character-set=utf8mb4 mysql < /tmp/mysql.sql
gunzip < /tmp/mysql.gz | mysql -u meteorcat -p'cc6d8ee8b4b1c5696e5dbcb82e6329ff' --default-character-set=utf8mb4 mysql
|
后续可以尝试自己编写脚本定时保存数据库.
定时脚本
这里采用系统内部的 Systemctl 编写系统脚本, 用于统一的备份脚本, 计划直接采用的备份命令类似如下:
1
| sudo systemctl start mariadb-backup@数据库名
|
这样直接将数据库保存到指定位置去, 生成 数据库名_时间戳.gz, 同时需要独立单个账号只允许本地服务器进行执行.
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 创建本地权限账号 CREATE USER 'backup'@'localhost' IDENTIFIED BY 'cc6d8ee8b4b1c5696e5dbcb82e6329ff'; # 授予需要的权限, 注意这里授予本地访问 GRANT ALTER , INSERT, LOCK TABLES, SHOW VIEW, SELECT, UPDATE ON *.* TO 'backup'@'localhost' IDENTIFIED BY 'cc6d8ee8b4b1c5696e5dbcb82e6329ff' WITH GRANT OPTION; # 重新装载权限 FLUSH PRIVILEGES;
|
这里有个知识点就是利用系统配置文件: /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf 的 [mysqldump] 配置块.
这里编辑客户端配置文件 50-mysql-clients.cnf:
1 2 3 4
| [mysqldump]
user = backup password = cc6d8ee8b4b1c5696e5dbcb82e6329ff
|
这里默认 mysqldump 就会调用到该账号, 这里测试直接导出数据是否可以直接允许导出:
1 2
| mysqldump --add-drop-table --default-character-set=utf8mb4 mysql > /tmp/mysql.sql
|
这时候如果没问题能够正常导出的话就说明默认本地账户思路是正确的, 这时候就考虑编写系统服务.
创建系统服务文件:
系统配置内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
[Unit] Description=MariaDB database backup( Database = %I ) Documentation=https://mariadb.org/ After=syslog.target After=mysql.service
ConditionPathIsDirectory=/backup [Service]
Type=oneshot RemainAfterExit=no
User=mysql Group=mysql
ExecStart=/usr/bin/mysqldump --add-drop-table --default-character-set=utf8mb4 %I StandardOutput=file:/backup/%I.sql StandardError=file:/backup/%I_error.sql
ExecStartPost=/usr/bin/sh -c "exec /usr/bin/mv -f /backup/%I.sql /backup/%I_`/usr/bin/date +%%Y%%m%%d`.sql"
PrivateTmp=false [Install] WantedBy=multi-user.target
|
之后重新更新系统的注册服务并且创建备份目录执行备份:
1 2 3
| sudo systemctl daemon-reload sudo mkdir /backup sudo chown -R mysql:mysql /backup
|
测试系统备份服务:
如果没问题生成了 备份文件.sql 那就是已经完成系统备份, 接下来就是编写每天/每周定时服务来执行, 采用 Systemctl
的定时器来触发:
定时器内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| [Unit] Description=MariaDB-based database backup every hour [Timer]
OnCalendar=*-*-* *:*:00
Unit=mariadb-backup@%I.service [Install] WantedBy=multi-user.target
|
这样定时器也完成编写, 加载系统服务并且确实定时脚本:
确认备份会被定时触发, 这样就能看到备份数据库是否正常.