Genius Kim's Blog - 数据库
type: channel
link: https://blog.if010.com/category/database/
items: MySQL 数据加密
items: SQL Server根据值内容查询表和列名字
items: Redis的四种部署方案
items: Redis 缓存满了怎么办？
items: 达梦数据库食用说明
items: MySQL自动添加系统时间
items: 达梦数据库维护常见问题记录
items: MSSQL中开启CDC导致事务日志空间被占满事件记录
items: Oracle单机部署方案
items: Redis的安装与新特性ACL安全策略

MySQL 数据加密
type: item
date: 2024-02-25T13:49:46+00:00
description: MySQL 数据加密主要用于保护存储在数据库中的敏感信息，如用户密码、个人身份信息等。MySQL 提供了多种数据加密方法，主要包括以下几种：对称加密AES_ENCRYPT() 和 AES_DECRYPT() 函数是MySQL支持使用高级加密标准(AES)进行对称加密。这意味着同一个密钥用于加密和解密数据。例如，你可以用以下方式加密和解密数据：INSERT INTO users (username, password) VALUES ('user1', AES_ENCRYPT('mypassword', 'mysecretkey')); SELECT AES_DECRYPT(password, 'mysecretkey') FROM users WHERE username = 'user1';哈希函数MySQL可以使用这些散列函数(如SHA-1、SHA-256)来“加密”密码，但实际上这是一种单向哈希操作，目的是为了验证密码而非解密。当用户输入密码时，应用会重新计算散列值并和数据库中存储的散列值做比较。INSERT INTO users (username, password_hash) VALUES ('user1', SHA2('mypassword', 256)); -- 验证密码时 SELECT * FROM users WHERE username = 'user1' AND password_hash = SHA2('userinputpassword', 256);MySQL 5.7 引入了 caching_sha2_password 密码插件作为默认的认证机制，它使用 SHA-256 算法对密码进行加密处理非对称加密MySQL 还支持使用公钥/私钥对（如RSA算法）进行加密。这种方式下，通常使用公钥 加密数据，私钥则用于解密。不过，在MySQL内部直接使用这种加密方式并不常见，但在客户端与服务器通信过程中可能会用到。透明数据加密(TDE)MySQL Enterprise Edition提供了透明数据加密功能，可以加密整个数据库文件或表空间，确保即使数据库文件被窃取，也无法直接读取其中的数据。根据实际需求选择合适的加密方式是非常重要的，同时要注意秘钥的安全管理，防止秘钥泄露导致的数据安全问题。对于密码等敏感信息，推荐采用哈希加盐的方式存储，并结合合理的策略应对彩虹表攻击。

SQL Server根据值内容查询表和列名字
type: item
date: 2023-11-13T02:35:00+00:00
description: 有时候我们知道一个值，但是不知道这个值在库里边的那个表中，是哪个字段，可以用以下的语句来进行查询，比如我们查询“张三”在那个表的那个字段：DECLARE @cloumns VARCHAR(40); DECLARE @tablename VARCHAR(40); DECLARE @str VARCHAR(40); DECLARE @counts INT; DECLARE @sql NVARCHAR(2000); DECLARE MyCursor CURSOR FOR SELECT a.name AS Columns, b.name AS TableName FROM syscolumns a, sysobjects b, systypes c WHERE a.id = b.id AND b.type = 'U' AND a.xtype = c.xtype AND c.name LIKE '%char%'; SET @str = '张三'; OPEN MyCursor; FETCH NEXT FROM MyCursor INTO @cloumns, @tablename; WHILE (@@Fetch_Status = 0) BEGIN SET @sql = N'select @tmp_counts=count(*) from ' + @tablename + N' where ' + @cloumns + N' = ''' + @str + N''''; EXECUTE sp_executesql @sql, N'@tmp_counts int out', @counts OUT; IF @counts > 0 BEGIN PRINT '表名为:' + @tablename + ',字段名为' + @cloumns; END; FETCH NEXT FROM MyCursor INTO @cloumns, @tablename; END; CLOSE MyCursor; DEALLOCATE MyCursor;结果：

Redis的四种部署方案
type: item
date: 2023-11-01T12:40:00+00:00
description: 这篇文章介绍Reids最为常见的四种部署模式，其实Reids和数据库的集群模式差不多，可以分为 Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署，其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境，最常见的还是集群模式的部署接下来我们来主要分析和学习一下的部署方式和利弊。约定信息：系统：Linux CentOS 7.9Redis版本：Redis 7.2.2方案一：单机模式部署编译部署# 设置内核参数 [root@redis ~]# echo "vm.overcommit_memory=1" >> /etc/sysctl.conf [root@redis ~]# echo "net.core.somaxconn=511" >> /etc/sysctl.conf [root@redis ~]# sysctl # 查看生效情况 # 下载二进制包并编译 [root@redis ~]# wget http://download.redis.io/releases/redis-7.2.2.tar.gz [root@redis ~]# tar zxf redis-7.2.2.tar.gz -C /usr/local/ [root@redis ~]# cd /usr/local/redis-7.2.2/ [root@redis redis-7.2.2]# make # 编辑redis.conf配置文件 [root@redis redis-7.2.2]# vim redis.conf # 绑定主机iP bind 0.0.0.0 # 设置端口号 port 6379 # 启用后台运行 daemonize yes # 设置redis密码 requirepass 123123 # 启动并查看监听和进程 [root@redis ~]# /usr/local/redis-7.2.2/src/redis-server /usr/local/redis-7.2.2/redis.conf [root@redis ~]# ps -ef | grep redis root 878 1 0 23:24 ? 00:00:00 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H redis eth0 root 12429 1 0 23:42 ? 00:00:00 /usr/local/redis-7.2.2/src/redis-server 0.0.0.0:6379 root 12505 12289 0 23:43 pts/1 00:00:00 grep --color=auto redis [root@redis ~]# netstat -tnlp | grep redis tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 12429/redis-server # 停止 [root@redis ~]# ./redis-cli -p 6379 -a 123123 shutdown # 客户端连接测试测试 [root@redis ~]# /usr/local/redis-7.2.2/src/redis-cli 127.0.0.1:6379> auth 123123 OK 127.0.0.1:6379> set flag if010.com OK 127.0.0.1:6379> get flag "if010.com" 127.0.0.1:6379>使用systemctl进行管理[root@redis ~]# cp ../utils/redis_init_script /etc/init.d/redis #不同版本可能位置不同 [root@redis ~]# vim /etc/init.d/redis Port : 6379 Config file : /usr/local/redis/conf/redis.conf Log file : /usr/local/redis/log/redis.log Data dir : /usr/local/redis/data Executable : /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf Cli Executable : /usr/local/redis/bin/redis-cli # redis Start up the redis server daemon # # chkconfig: 2345 55 25 添加…

Redis 缓存满了怎么办？
type: item
date: 2023-08-21T05:29:00+00:00
description: 引言Redis 缓存使用内存来保存数据，随着需要缓存的数据量越来越大，有限的缓存空间不可避免地会被写满。此时，应该怎么办？本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。值得注意的是，在 Redis 中 过期策略 和 内存淘汰策略 是两个完全不同的概念。Redis 过期策略指的是 Redis 使用哪种策略，来删除已经过期的键值对；而内存淘汰机制指的是当 Redis 运行内存已经超过设置的最大内存之后，将采用什么策略来删除符合条件的键值对，以此来保障 Redis 高效的运行。Redis 最大运行内存只有在 Redis 的运行内存达到了某个阀值，才会触发内存淘汰机制，这个阀值就是我们设置的最大运行内存，此值在 Redis 的配置文件中可以找到，配置项为 maxmemory。内存淘汰执行流程，如下图所示：查询最大运行内存我们可以使用命令 config get maxmemory 来查看设置的最大运行内存，命令如下：127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "0"我们发现此值竟然是 0，这是 64 位操作系统默认的值，当 maxmemory 为 0 时，表示没有内存大小限制。注意：32 位操作系统，默认的最大内存值是 3GB。内存淘汰策略查看 Redis 内存淘汰策略我们可以使用 config get maxmemory-policy 命令，来查看当前 Redis 的内存淘汰策略，命令如下：127.0.0.1:6379> config get maxmemory-policy 1) "maxmemory-policy" 2) "noeviction"可以看出此 Redis 使用的是 noeviction 类型的内存淘汰机制，它表示当运行内存超过最大设置内存时，不淘汰任何数据，但新增操作会报错。内存淘汰策略分类早期版本的 Redis 有以下 6 种淘汰策略：noeviction：不淘汰任何数据，当内存不足时，新增操作会报错，Redis 默认内存淘汰策略；allkeys-lru：淘汰整个键值中最久未使用的键值；allkeys-random：随机淘汰任意键值;volatile-lru：淘汰所有设置了过期时间的键值中最久未使用的键值；volatile-random：随机淘汰设置了过期时间的任意键值；volatile-ttl：优先淘汰更早过期的键值。在 Redis 4.0 版本中又新增了 2 种淘汰策略：volatile-lfu：淘汰所有设置了过期时间的键值中，最少使用的键值；allkeys-lfu：淘汰整个键值中最少使用的键值。其中 allkeys-xxx 表示从所有的键值中淘汰数据，而 volatile-xxx 表示从设置了过期键的键值中淘汰数据。修改 Redis 内存淘汰策略设置内存淘汰策略有两种方法，这两种方法各有利弊，需要使用者自己去权衡。方式一：通过“config set maxmemory-policy 策略”命令设置。它的优点是设置之后立即生效，不需要重启 Redis 服务，缺点是重启 Redis 之后，设置就会失效。方式二：通过修改 Redis 配置文件修改，设置“maxmemory-policy 策略”，它的优点是重启 Redis 服务后配置不会丢失，缺点是必须重启 Redis 服务，设置才能生效。内存淘汰算法从内存淘汰策略分类上，我们可以得知，除了随机删除和不删除之外，主要有两种淘汰算法：LRU 算法 和 LFU 算法。LRU 算法LRU 全称是 Least Recently Used 译为最近最少使用，是一种常用的页面置换算法，选择最近最久未使用的页面予以淘汰。1. LRU 算法实现LRU 算法需要基于链表结构，链表中的元素按照操作顺序从前往后排列，最新操作的键会被移动到表头，当需要内存淘汰时，只需要删除链表尾部的元素即可。2. 近 LRU 算法Redis 使用的是一种近似 LRU 算法，目的是为了更好的节约内存，它的实现方式是给现有的数据结构添加一个额外的字段，用于记录此键值的最后一次访问时间，Redis 内存淘汰时，会使用随机采样的方式来淘汰数据，它是随机取 5 个值（此值可配置），然后淘汰最久没有使用的那个。3. LRU 算法缺点LRU 算法有一个缺点，比如说很久没有使用的一个键值，如果最近被访问了一次，那么它就不会被淘汰，即使它是使用次数最少的缓存，那它也不会被淘汰，因此在 Redis 4.0 之后引入了 LFU 算法，下面我们一起来看。LFU 算法LFU 全称是 Least Frequently Used 翻译为最不常用的，最不常用的算法是根据总访问次数来淘汰数据的，它的核心思想是“如果数据过去被访问多次，那么将来被访问的频率也更高”。LFU…

达梦数据库食用说明
type: item
date: 2023-07-30T14:54:00+00:00
description: 环境准备达梦数据库支持Windows、Linux和Unix操作系统，达梦正式版需要授权，我们学习的话选择试用即可，在本机使用VM安装一个Centos，然后去达梦官网下载适用自己平台的安装包。本教程使用的是VM安装的centos7.9。所以选择X86架构、Centos7的安装包。官网下载：https://www.dameng.com/list_103.html本地下载：https://resource.if010.com/dmdb/dm8_20230418_x86_rh6_64.ios安装为了更好的管理用户与资源消耗，我们可以添加一个用户组专门处理达梦数据库。添加用户# 添加组 groupadd dinstall # 添加安装用户 useradd -g dinstall dmdba # 设置dmdba密码：dm123123 echo "dm123123" | passwd dmdba --stdin设定限制切换到dmdba账户，查看限制信息，使用root账户修改dmdba用户资源限制。# 切换到dmdba账户，查看当前用户限制信息 id dmdba ulimit -a# 使用root账户修改配置 cat >> /etc/security/limits.conf << EOF dmdba soft nofile 65536 dmdba hard nofile 65536 EOF统一管理应用设定# 使用root账号根目录创建app/dmDB8文件夹 mkdir -p /app/dmDB8 # 数据文件存放目录 mkdir -p /app/dmDB8/installData # 达梦安装文件目录 mkdir -p /app/dmDB8/data # 开通dmdba权限 chown -R dmdba:dinstall /app/dmDB8关闭防火墙# 检查防火墙状态 firewall-cmd --state # 停止并禁用防火墙 systemctl stop firewalld systemctl disable firewalld # 删除防火墙 yum remove firewalld安装依赖包检查依赖包是否正常，缺少哪个依赖就安装哪个即可。注意需要使用root用户才能安装# 检查是否安装相关依赖 rpm -q glibc rpm -q libXp rpm -q libXt rpm -q libXtst # 安装依赖 yum install glibc yum install libXp yum install libXt yum install libXtst安装准备cd /app/dmDB8/ unzip dm8_20230418_x86_rh6_64.zip mount -o loop dm8_20230418_x86_rh6_64.iso /mnt切换到dmdba用户，然后进入mnt目录查看文件，调用bin文件开始安装cd /mnt/ # 192.168.31.209本机ip export DISPLAY=192.168.31.209:0.0 ./DMInstall.bin图形化安装学习使用，不用填写key，直接下一步注意：安装到对应的自定义目录，并且安装文件夹需要是空的非常重要的点：安装完成之后，一定不要直接点OK，认真观看提示到这一步之后，先复制软件提供的命令，然后使用root账号执行点击确定-->完成初始化数据库完成之后，点击初始化数据库，出现以下界面，开始创建数据库，又或者是使用/app/dmDB8/installData/tool/dbbca.sh目录下的工具初始化数据库需要修改下数据库对应文件所在位置下一步之后，可以修改数据名称与实例名这里手动改一下时区（按照实际情况修改），其他默认即可设置统一密码，我这边设置：dameng123123选择提供完整示例demo点击finish完成，然后开始创建，同样注意提示，用root账号执行相应命令执行完成之后，可以用以下命令检查状态# 注意服务名称 # 查看是否开机自启 systemctl is-enabled DmServiceIf010TestIns.service # 查看服务状态 systemctl status DmServiceIf010TestIns.service进入data目录查看文件使用tool目录下的disql登录数据库，至此图形化安装完成删除数据库删除数据库，包括删除数据库的数据文件、日志文件、控制文件和初始化参数文件，为了保证删除数据库成功，必须保证dmserver已关闭，可以使用数据库配置工具来删除数据库。使用root账户停止服务# 停止服务 systemctl stop DmServiceIf010TestIns # 查询服务状态，确保停止 sy…

MySQL自动添加系统时间
type: item
date: 2023-07-18T06:40:00+00:00
description: MySQL时间类型DATE类型：存储年月日TIME类型：存储时分秒DATETIME类型：存储YYYY-MM-DD HH:MM:SSTIMESTAMP类型：存储YYYYMMDDHHMMSS在使用mysql数据库时，常用的类型就是date和datetimedatetime和timestamp有什么区别都可以用来存储：年月日时分秒，两者都可以精确到毫秒，比如：datetime(3)、timestamp(3)，就是精确到三位毫秒值timestamp更适合跨时区的业务，mysql5.6.4之后的版本，可以精确到毫秒，并且可以指定mysql的时间类型有两个属性，分别是CURRENT\_TIMESTAMP 和ON UPDATE CURRENT\_TIMESTAMP两种，使用情况分别如下：CURRENT\_TIMESTAMP：当要向数据库执行insert操作时，如果有个timestamp字段属性设为CURRENT\_TIMESTAMP，则无论这个字段有没有set值都插入当前系统时间ON UPDATE CURRENT\_TIMESTAMP：当执行update操作时，并且字段有ON UPDATE CURRENT\_TIMESTAMP属性。则字段无论值有没有变化，他的值也会跟着更新为当前UPDATE操作时的时间例如：创建表名时指定创建时间和修改时间字段：CREATE TABLE `example` ( `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID信息', `name` varchar(100) NOT NULL DEFAULT "" COMMENT '姓名', `age` int NOT NULL COMMENT '年龄', `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;查看表结构，desc example，如下所示：mysql> DESC example; +----------+--------------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+-------------------+-----------------------------------------------+ | id | int unsigned | NO | PRI | NULL | auto_increment | | name | varchar(100) | NO | | | | | age | int | NO | | NULL | | | created | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | modified | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | +----------+--------------+------+-----+-------------------+-----------------------------------------------+ 5 rows in set (0.00 sec)执行命令插入数据，观察创建和修改时间，都为当前操作时间，如下所示：mysql> INSERT INTO example (name,age) values ("jerry",25); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM example; +----+-------+-----+---------------------+---------------------+ | id | name | age | created | modified | +----+-------+-----+---…

达梦数据库维护常见问题记录
type: item
date: 2023-01-11T07:27:00+00:00
description: 达梦数据库用户登录限制查询select b.username as "达梦数据库用户名", a.failed_num as "失败次数限制", a.failed_attemps as "失败尝试次数", a.lock_time as "锁定时间(min)" from sysusers a right join all_users b on a.id=b.user_id; 达梦数据库用户锁定状态查询select username as "达梦数据库用户名", account_status as "账户状态", lock_date as "锁定时间" from dba_users; 当前正在执行语句SELECT * FROM ( SELECT SESS_ID,SQL_TEXT,DATEDIFF(SS,LAST_SEND_TIME,SYSDATE) SS, SF_GET_SESSION_SQL(SESS_ID) FULLSQL FROM V$SESSIONS WHERE STATE='ACTIVE') WHERE SS>=1; 当前导致锁表的SQL查询select * from v$sessions a, v$lock b where a.trx_id = b.trx_id and a.state='ACTIVE'; 查询数据库总大小select sum(bytes)/1024/1024/1024 as "Size(GB)" from SYS.DBA_DATA_FILES; 查表select getname(c_name),c_tablename,c_code from tb_inf_infoset where c_tablename= upper('tb_sta_workflow_history'); 查字段select getname(c_name),c_column_name,c_constant_type from tb_inf_infoitem where c_infoset_code='TB_STA_WORKFLOW_HISTORY'; 查参数值select getname(c_name),c_code from tp_code_item where c_type_code='PROC_STATUS'; 根据字段查表select getname(c_name), c_tablename, c_code from tb_inf_infoset where c_code in (select c_infoset_code from tb_inf_infoitem where getname(c_name) like '%入本单位时间%'); select * fom user_tab_colums where column_name =upper('字段名');

MSSQL中开启CDC导致事务日志空间被占满事件记录
type: item
date: 2023-01-11T03:23:00+00:00
description: 问题描述SQLServer中开启CDC之后，在某些情况下会导致事务日志空间被占满的现象为：在执行增删改语句（产生事务日志）的过程中提示，The transaction log for database '***' is full due to 'REPLICATION'(数据库“***”的事务日志已满，原因为“REPLICATION”).CDC以及复制的基本原理粗略地讲，对于日志的使用步骤如下： 1、每当基础表（开启了CDC或者replication的表）产生事务性操作（增删改）之后，对应的事务日志写入日志文件； 2、此时的日志被状态被标记为Replication，也即处于待复制状态，这个活动状态跟数据库的还原模式无关，即便是简单还原模式； 3、然后有后台进程来读取这个日志，根据事务日志的内存写入目标表，这个目标对于cdc来说是记录数据变化的系统表，对于replication来说是写入distribution这个库； 4、步骤3完成之后，事务日志被标记为正常状态，如果是简单还原模式，被后台进程解析过的事务日志被截断，可以重用；如果上述中间的第三个步骤出现问题，也即后台进程无法解析日志后释放可用的日志空间，再次往数据库中写入操作，就会出现：数据库“TestDB”的事务日志已满，原因为“REPLICATION”的情况本文通过通过演示开启CDC的情况下日志空间被占满的现象，以及对应的处理办法测试环境准备首先建立一个测试数据库USE master GO CREATE DATABASE TestLogFull ON PRIMARY ( NAME = N'TestLogFull', FILENAME = N'D:\DBFile\TestLogFull\TestLogFull.mdf' , SIZE = 500MB , MAXSIZE = UNLIMITED, FILEGROWTH = 100MB ) LOG ON ( NAME = N'TestLogFull_log', FILENAME = N'D:\DBFile\TestLogFull\TestLogFull_Log.ldf' , SIZE = 1MB , MAXSIZE = 512MB ) 这里创建了一个名为TestLogFull的数据库指定日志文件的最大为512M，主要是为了演示日志空间被占满的现象；接着开启新建一个表同时开启CDC来测试USE TestLogFull --启用CDC EXECUTE sys.sp_cdc_enable_db; GO --创建一张测试表 create table test_cdc ( id int identity(1,1) primary key, name nvarchar(50), mail varchar(50), address nvarchar(50), lastupdatetime datetime ) --对表启用CDC EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'test_cdc', @role_name = 'cdc_admin', @capture_instance = DEFAULT, @supports_net_changes = 1, @index_name = NULL, @filegroup_name = DEFAULT CDC开启成功，开始测试日志被占满的情况SELECT NAME, CASE is_tracked_by_cdc WHEN 1 THEN '已开启CDC' ELSE ‘未开启 CDC’ END AS result FROM sys.TABLES WHERE OBJECT_ID = OBJECT_ID(dbo.test_cdc) 问题分析演示对某些表开启CDC的情况下日志文件文件被占满的三种情况：1、代理服务器未启动导致日志空间被占满文中一开始提到的步骤3，对于CDC，进程就是SQL Server Agent中的cdc.***_capture作业或者复制代理作业来读取日志,如果SQL Server Agent在开启了CDC或者复制之后被关闭，或者重启服务器之后SQL Server Agent没有随机自动启动就有可能造成步骤2中的日志积压，也就是记录数据变化之后的事务日志处于replication状态，无法重用，导致没有可以使用的日志,致使发生操作数据库的时候提示The transaction log for database '***' is full due to 'REPLICATION'. 这里暂时关闭代理服务（仅仅是为了测试演示这一现象）增删改都可以产生事务日志，这里就演示insert数据的情况，做一个写…

Oracle单机部署方案
type: item
date: 2022-11-08T01:47:00+00:00
description: 准备环境材料的准备Oracle 11g安装包：百度云链接：https://pan.baidu.com/s/1eVnOtliqTCw0cyrIg7T8sA [scode type="blue" size=""]关注公众号 “akim同学” 回复 “Oracle_11g安装包” 即可获得网盘分享密码[/scode]系统的准备基本设置# 关闭selinux setenforce 0 sed -i '/SELINUX/{s/enforcing/disabled/}' /etc/selinux/config # 关闭防火墙，禁止开机启动 systemctl disable firewalld.service systemctl stop firewalld.service 安装图形化界面# 安装X Window System和GNOME Desktop yum groupinstall -y “X Window System” "GNOME Desktop" # 启用图形化界面 startx systemctl get-default,该命令查看当前是那种模式.systemctl set-default graphical.target,开机启动图形界面.systemctl set-default multi-user.target,开机启动字符界面模式.reboot,重启系统之后才会生效哟~工具、补丁、依赖安装yum -y install elfutils-devel unixODBC* unixODBC.i686 unixODBC-devel.i686 binutils.x86_64 compat-libcap1.x86_64 compat-libstdc++-33.i686 compat-libstdc++-33.x86_64 gcc.x86_64 gcc-c++.x86_64 glibc.i686 glibc.x86_64 glibc-devel.i686 glibc-devel.x86_64 ksh libaio.i686 libaio.x86_64 libaio-devel.i686 libaio-devel.x86_64 libgcc.i686 libgcc.x86_64 libstdc++.i686 libstdc++.x86_64 libstdc++-devel.i686 libstdc++-devel.x86_64 libXi.i686 libXi.x86_64 libXtst.i686 libXtst.x86_64 make.x86_64 sysstat.x86_64 vim epel-release lrzsz unzip xorg* yum -y update swap分区swap分区有两种方式，一种是新建磁盘分区作为swap分区，另一种是用文件作为Swap分区。这里使用的是后者，想用前者的可以参考-->这个链接<--。SWAP空间大小建议值：物理内存大小（RAM）SWAP空间大小2GB~8GB2倍于RAM8GB~32GB1.5倍于RAM32GB以上32GB# 创建要作为swap分区的文件:增加1GB大小的交换分区，则命令写法如下，其中的count等于想要的块的数量（bs*count=文件大小） dd if=/dev/zero of=/root/swapfile bs=1M count=8192 # 格式化为交换分区文件，建立swap的文件系统 mkswap /root/swapfile # 启用交换分区文件 swapon /root/swapfile # 使系统开机时自启用，在文件/etc/fstab中添加一行 /root/swapfile swap swap defaults 0 0 # 查看Swap分区大小 grep SwapTotal /proc/meminfo 修改系统内核参数vim /etc/sysctl.conf fs.file-max = 6815744 fs.aio-max-nr = 1048576 kernel.shmall = 1048576 kernel.shmmax = 4294967295 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 net.ipv4.tcp_wmem = 262144 262144 26214…

Redis的安装与新特性ACL安全策略
type: item
date: 2022-10-13T06:55:00+00:00
description: Yum安装Redis直接使用yum install redis命令安装的Redis可能不是最新版本，如果需要安装新版本则需要安装Remi的软件源，命令如下：yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 安装并启动#安装 yum --enablerepo=remi install redis #设置开机自启 systemctl enable redis #启动服务 systemctl start redis 查看服务状态 systemctl status redis 查看Redis版本 redis-cli --version 配置远程连接vim /etc/redis.conf bind 0.0.0.0 ACL安全策略在 Redis6 之前的版本，我们只能使用 requirepass 参数给 default 用户配置登录密码，同一个 redis 集群的所有开发都共享 default 用户，难免会出现误操作把别人的 key 删掉或者数据泄露的情况，因此 Redis6 版本推出了ACL（Access Controller List）访问控制权限的功能，基于此功能，我们可以设置多个用户，并且给每个用户单独设置命令权限和数据权限。为了保证向下兼容，Redis6 保留了 default 用户和使用 requirepass 的方式给 default 用户设置密码，默认情况下 default 用户拥有 Redis 最大权限，我们使用 redis-cli 连接时如果没有指定用户名，用户也是默认 default。配置 ACL 的方式有两种，一种是在 config 文件中直接配置，另一种是在外部 aclfile 中配置。配置的命令是一样的，但是两种方式只能选择其中一种，我们之前使用 requirepass 给 default 用户设置密码 默认就是使用 config 的方式，执行 config rewrite 重写配置后会自动在 config 文件最下面新增一行记录配置 default 的密码和权限redis密码设置在 Redis 6.0 之前，Redis 只有一个 default 用户也是 Redis 中的超级管理员用户，如果要将其设置密码，需要修改 Redis 配置文件，具体修改如下requirepass 123456 修改之后，再次进入 Redis 时，发现已经没有权限操作了。[root@localhost ~]# redis-cli --raw 127.0.0.1:6379> set a b NOAUTH Authentication required 这个时候我们需要使用密码的方式进入[root@openstack ~]# redis-cli 127.0.0.1:6379> auth 123456 OK 127.0.0.1:6379> set a b OK 或者 [root@openstack ~]# redis-cli -a 123456 --raw Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> set a b OK 我们可以直接在 config 配置文件中使用上面 default 用户 ACL 这行 DSL 命令设置用户权限，或者我们也可以配置外部 aclfile 配置权限。配置 aclfile 需要先将 config 中配置的 DSL 注释或删除，因为 Redis 不允许两种ACL 管理方式同时使用，否则在启动 redis 的时候会报下面的错误Configuring Redis with users defined in redis.conf and at the same setting an ACL file path is invalid. This setup is very likely to lead to configuration errors and security holes, please define either an ACL file or declare users directly in your redis.conf, but not both外部ACLFILE模式注释 redis.conf 中所有已授权的 ACL 命令，如：# user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* +@all 在 con…