Skip to content

mysql 数据库管理

安全及权限

权限层级

在MySQL中,权限可以分为多个层级,包括全局权限、数据库级权限、表级权限、列级权限和例程级权限

分配的原则

  • 最小权限原则:每个用户只有完成其工作所必需的最小权限集合。
  • 按需分配:根据用户的角色和职责分配权限
  • 定期审计:定期检查用户权限,确保没有不必要的权限遗留。

举例

-- 只读权限
GRANT SELECT ON mydb.* TO 'data_analyst'@'localhost';

-- 读写权限
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_developer'@'localhost';

-- 数据库管理员需要所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'db_admin'@'localhost';

定期审计

-- 查看当前所有用户的权限
SELECT * FROM mysql.user\G;

-- 查看特定用户的权限
SHOW GRANTS FOR 'data_analyst'@'localhost';
-- 回收某个用户的某项权限
REVOKE INSERT ON mydb.* FROM 'app_developer'@'localhost';

-- 删除不再需要的用户账号
DROP USER 'ex_employee'@'localhost';

数据加密

  • 对于敏感字段,如密码、个人信息等,始终使用加密存储。
  • 使用强加密算法,如AES。
  • 保护好密钥,不要在代码或配置文件中硬编码。

在MySQL中,我们可以使用内置的加密函数来加密数据。

-- 假设我们需要存储用户密码
ALTER TABLE user_info ADD COLUMN encrypted_password VARCHAR(255);

-- 使用AES加密用户密码
UPDATE user_info SET encrypted_password = AES_ENCRYPT('password123', 'my_secret_key');

安全优化Tips

  • 使用复杂的密码,并定期更换。
  • 不要使用root账户进行日常操作。
  • 定期备份数据库,以防万一。

性能配置

mysqld --verbose --help | grep "Default options" -A 1

关键配置项

「innodb_buffer_pool_size」: InnoDB存储引擎的缓冲池大小,一般建议设置为系统内存的60%-80%
「innodb_log_file_size」: InnoDB的日志文件大小,对于事务的写入有很大影响。如果设置得过小,可能会导致频繁的I/O写入操作
「innodb_flush_log_at_trx_commit」: 控制日志刷新到磁盘的策略。值为1表示每次事务提交都会写入日志,确保数据的安全性,但可能影响性能;值为2或0可以提升性能,但在崩溃时可能丢失数据。
「max_connections」: 允许的最大连接数
「query_cache_size」: 查询缓存的大小 提升读操作的性能。但在高并发写入的场景中,查询缓存可能反而降低性能
「tmp_table_size」 和 「max_heap_table_size」: 决定了临时表的最大大小,如果临时表超过这个大小,它会转换为磁盘上的MyISAM表,影响性能

备份

逻辑备份,物理备份,热备份,冷备份。clone

这里选用 xtrabackup

wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/debian/jammy/x86_64/percona-xtrabackup-80_8.0.35-30-1.jammy_amd64.deb

备份设计: on-deman 手动一次触发 sechulder 周期备份。 备份保留策略

# 一次全备
xtrabackup --backup --parallel=10 --host=10.10.2.13 --user=root --target-dir=/tmp/full -p
xtrabackup --prepare --use-memory=2G --target-dir=/tmp/full

# 增量备份
xtrabackup --backup --host=10.10.2.13 --user=root --target-dir=/tmp/a/inc1 --incremental-basedir=/tmp/a/ -p

xtrabackup --prepare --apply-log-only --target-dir=/tmp/a  

xtrabackup --prepare --apply-log-only --target-dir=/tmp/a --incremental-dir=/tmp/a/inc1/  

# 压缩备份
xtrabackup --backup  --compress --compress-threads=8 --host=10.10.2.13 --user=root --target-dir=/tmp/c -p

# 流备份
xtrabackup --backup --stream=xbstream --host=10.10.2.13 --user=root --target-dir=/tmp/a -p 2>/data/backup/xtrabackup.log > /tmp/backup0625.xbstream

数据导出导入

--导出表结构
mysqldump -uroot -proot -h192.168.6.10 -P3306 --databases XXX \
--tables XXX --single-transaction \
--hex-blob --no-data --routines --events --triggers --master-data=2 --set-gtid-purged=OFF \
--default-character-set=utf8 | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' \
-e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' \
-e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' \
-e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' \
-e 's/DEFINER[ ]*=.*EVENT/EVENT/' \
-e 's/DEFINER[ ]*=.*SQL SECURITY DEFINER/SQL SECURITY DEFINER/' \
> /home/mysql/backup/XXX_ddl.sql

--导出数据,可以带条件  --where="column1=1"
mysqldump -uroot -proot -h192.168.6.10 -P3306 --databases XXX \
--tables XXX \
--single-transaction --hex-blob --no-create-info \
--skip-triggers --master-data=2 \
--default-character-set=utf8 > /home/mysql/backup/XXX_data.sql

配置

慢查询

``` 也可以在MySQL命令行中修改参数开启慢查询日志 mysql> SET GLOBAL slow_query_log = 1; mysql> SET GLOBAL slow_query_log_file = '/data/mysql/log/query_log/slow_statement.log'; mysql> SET GLOBAL long_query_time = 10; mysql> SET GLOBAL log_output = 'FILE'; 连接数 --Connections

保持在缓存中的可用连接线程

default = -1(无)

thread_cache_size = 16

最大的连接线程数(关系型数据库)

default = 151

max_connections = 1000

最大的连接线程数(文档型/KV型)

default = 100

mysqlx_max_connections = 700

--缓冲区 Buffer

缓冲区单位大小;default = 128M

innodb_buffer_pool_size = 128M

缓冲区总大小,内存的70%,单位大小的倍数

default = 128M

innodb_buffer_pool_size = 6G

以上两个参数的设定,MySQL会自动改变 innodb_buffer_pool_instances 的值

--I/O 线程数

异步I/O子系统

default = NO

innodb_use_native_aio = NO

读数据线程数

default = 4

innodb_read_io_threads = 32

写入数据线程数

default = 4

innodb_write_io_threads = 32

--Open cache

default = 5000

open_files_limit = 10000

计算公式:MAX((open_files_limit-10-max_connections)/2,400)

default = 4000

table_open_cache = 4495

超过16核的硬件,肯定要增加,以发挥出最大性能

default = 16

table_open_cache_instances = 32 ```

binlog 清理

## 自动清理
show variables like '%binlog_expire_logs_seconds%'  

mysql8.0
mysql 8开始 expire_logs_days 废弃 ,
启用binlog_expire_logs_seconds设置binlog
自动清除日志时间,保存时间 
以秒为单位;默认2592000 30天
14400   4小时;86400  1天;259200  3天;
mysql> set global binlog_expire_logs_seconds=86400;

## 手动清理
查看日志文件。
mysql>show binary logs;
第二步:查看正在使用的日志文件:show master status;
mysql>show master status;
当前正在使用的日志文件是mysqlhost01-bin.000010,
那么删除日志文件的时候应该排除掉该文件。
删除日志文件的命令:purge binary logs to 'mysqlhost01-bin.000010';
mysql>purge binary logs to 'mysqlhost01-bin.000010';

## 切换日志
flush logs;

日志

    重做日志(redo log)
    回滚日志(undo log)
    归档日志(binlog)
    错误日志(errorlog)
    慢查询日志(slow query log)
    一般查询日志(general log)
    中继日志(relay log)

监控

pmm

mysql 监控管理用户
CREATE USER 'pmm'@'127.0.0.1' IDENTIFIED BY 'pass' WITH MAX_USER_CONNECTIONS 10;
GRANT SELECT, PROCESS, REPLICATION CLIENT, RELOAD, BACKUP_ADMIN ON *.* TO 'pmm'@'127.0.0.1';
server 端 安装
curl -fsSL https://www.percona.com/get/pmm | /bin/bash
agent 端 安装
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
dpkg -i percona-release_latest.generic_all.deb
apt-get update
apt install -y pmm2-client
apt-get install -y qpress

配置 注册 server
pmm-admin config --server-insecure-tls --server-url=https://admin:admin@10.10.2.14:443
cat /usr/local/percona/pmm2/config/pmm-agent.yaml
pmm-admin  add mysql --query-source=perfschema --host=10.10.2.12 --username=pmm --password=123456789

pmm-admin  add mysql --query-source=slowlog --host=10.10.2.12 --username=pmm --password=123456789

查看
pmm-admin status 
pmm-admin list 

常用命令

查看当前正在执行的SQL

SHOW FULL PROCESSLIST
show engine innodb status\G