Relative Content

K4NZDROID

category

「HELM」- 创建 Charts 并上传

该笔记将记录:通过 Helm 创建 Charts 并上传仓库的概述方法,以及相关问题的解决办法;
增 | 创建 Chart 制品
第一步、创建 Chart 项目
Helm | Helm Create

# helm create my-app
Creating my-app

# tree my-app/
my-app/
├── charts ——————————————————————– # 该目录当前 Chart 所依赖的 chart 保存;
├── Chart.yaml —————————————————————- # 关于 my-app 的信息;
├── templates —————————————————————– # 模板文件所在目录
│   ├── deployment.yaml
│   ├── _helpers.tpl ———————————————————— # 自定义的帮助函数,用于变量计算等等;
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests ——————————————————————- # 测试文件;
│   └── test-connection.yaml
└── values.yaml ————————————————————— # 模板的默认值;

3 directories, 10 files

# helm template my-app # 对模板进行渲染,以检查是否存在错误

# helm install my-app –name=my-app-name[……]

READ MORE

「REDIS」- 服务部署 | 测试学习

该笔记将记录:如何快速部署用于学习和测试的 Redis 服务,以及相关问题的解决办法。
服务部署
on CentOS 7.0
Linux 下 redis 安装与使用

# 安装服务
yum install -y redis.x86_64

# 启动服务,并设置为自启动
systemctl start redis.service
systemctl enable redis.service

on AWS / with ElasticCache Redis OSS
Design your own cache / Cluster cache
访问测试

#!/bin/sh

# redis-cli
127.0.0.1:6379> SET k4nz demo
OK
127.0.0.1:6379> GET k4nz
“demo”
127.0.0.1:6379> DEL k4nz
(integer) 1
127.0.0.1:6379> GET k4nz
(nil)

服务升级
WIP
与 Redis 有关的命令
redis-server – 服务端程序
redis-cli – 客户端程序
redis-sentinel – 到 redis-server 的软链接,使 redis 运行于 Sentinel 模式,官方推荐的高可用性(HA)解决方案
redis-benchmark – 用于 Redis 的基准测试
redis-check-aof – 用于 Redis AOF 文件的检查和修复
redis-check-rdb – 用于 Redis RDB 文件的检查[……]

READ MORE

「cert-manager」- DNSPod

如果域名使用腾讯云 DNSPod 管理,并期望在 Kubernetes 上为域名自动签发免费证书,可以使用 cert-manager 来实现。
cert-manager 支持许多 DNS provider,但不支持国内的 DNSPod 提供商。
不过 cert-manager 提供了 Webhook 机制来扩展 provider,社区也有 DNSPod 的 provider 实现。
cert-manager-webhook-dnspod | by imroc
https://github.com/imroc/cert-manager-webhook-dnspod

helm repo add cert-manager-webhook-dnspod https://imroc.github.io/cert-manager-webhook-dnspod
helm pull cert-manager-webhook-dnspod/cert-manager-webhook-dnspod

helm show values cert-manager-webhook-dnspod-1.5.2.tgz > cert-manager-webhook-dnspod-1.5.2.tgz.helm-values.yaml
vim cert-manager-webhook-dnspod-1.5.2.tgz.helm-values.yaml
… nameOverride:
… fullnameOverride:
… groupName:
… image.repository:
… image.tag:
… clusterIssuer.enabled: true
… clusterIssuer.secretId:
… clusterIssuer.secretKey:
… clusterIssuer.email:

helm upgrade –install –namespace cert-manager –create-namespace \
cert-manager-webhook-dnspod ./cert-manager-webhook-dnspod-1.5.2.tgz \
-f cert-manager-webhook-dnspod-1.5.2.tgz.helm-values.yaml

废弃 | cert-manager-webhook-dnspod | by qqshfox
使用 cert-manager 为 DNSPod 的域名签发免费证书
注意事项
我们找到其他的替代方案,所以暂时不再使用该组件。[……]

READ MORE

「BusyBox」- The Swiss Army Knife of Embedded Linux

认识
官网:https://busybox.net/ 文档:https://busybox.net/downloads/BusyBox.html 仓库:https://busybox.net/source.html
BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. BusyBox provides a fairly complete environment for any small or embedded system. 简而言之,BusyBox 将常用的 GNU Linux 工具(部分功能)集成到单个程序文件中,以降低资源消耗,进而应用于小型或嵌入式系统中。
组成
WIP
构建
针对我们的场景,我们更多使用其 Docker 镜像 | https://hub.docker.com/_/busybox
性质
WIP
场景
文本编辑 | 使用 vi 命令[……]

READ MORE

「MySQL」- 获取库的大小

在 MySQL 中,如何获取特定数据库(或特定表)所占用的磁盘空间的大小?
统计库大小 | Database Size
How to get size of mysql database?
在通常情况下,数据表与数据索引会占用磁盘空间(其他部分可以忽略):

// 统计 Databse 大小

SELECT table_schema AS “DB Name”,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS “DBinMB”
FROM information_schema.tables
GROUP BY table_schema
ORDER BY DBinMB DESC
LIMIT 30;

统计表大小 | Table Size
How to get the size of a table in MySQL

SELECT
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = “bookstore”
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;[……]

READ MORE

「DESCRIBE Syntax」

DESCRIBE和EXPLAIN语句是同义词,用于获取有关表结构或查询执行计划的信息。
参考文献
MySQL 5.7 Reference Manual / SHOW COLUMNS Syntax MySQL 5.7 Reference Manual / EXPLAIN Syntax[……]

READ MORE

「MySQL」- 优化查询语句

Optimizing SELECT Statements
Optimizing Subqueries and Derived Tables
优化 INFORMATION_SCHEMA 查询
MySQL 5.6 Reference Manual/Optimizing INFORMATION_SCHEMA Queries
1)在 WHERE 中,使用常量
通过使用常量,规避数据库目录及表文件访问次数。模糊匹配将扫描整个数据库目录。
2)编写 打开最少数量表文件的 查询
官方文档已列出访问某些表字段将触发的优化类型。
3)使用 EXPLAIN 查看优化
对查询语句使用 EXPLAIN 以查看 Extra 输出的优化类型。
Optimizing Data Change Statements
Optimizing Database Privileges
Other Optimization Tips[……]

READ MORE

「MySQL」- 使用 SSL 安全连接及 x509 证书登录

内容:MySQL SSL 加密链接;MySQL 强制证书登录;
MySQL v5.7
代码在本地测试修改,使用到了线上的数据库。开放端口之后,虽然端口改了,密码强度也够可以。但终究不放心; 所以决定本地使用 SSL 安全链接访问远程数据库,并且连接远程数据库强制要求客户端提供证书;
(1). 检查 MySQL 是否支持 SSL
https://dev.mysql.com/doc/refman/5.7/en/openssl-versus-yassl.html
根据官方描述: MySQL Enterprise Edition binary distributions,编译使用的 OpenSSL 库; MySQL Community Edition binary distributions,使用的是 yaSSL 库。(我们经常用的就是 Community Edition。我本地测试用的就是这个版本) MySQL Community Edition source distributions,自己编译的同学就自己看着办吧,编译的时候记得加参数; 参照官方文档「7.4.2 Building MySQL with Support for Secure Connections」
检查是否支持 SSL,通过查看 have_ssl 系统变量:

mysql> SHOW VARIABLES LIKE ‘have_ssl’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| have_ssl | YES |
+—————+——-+

如果想看使用了 OpenSSL 还是 yaSSL:

mysql> SHOW STATUS LIKE ‘Rsa_public_key’;
— Empty set (0.00 sec)

如果输出为“Empty set (0.00 sec)”则表示使用了 yaSSL 库;如果输出不为空,则表示使用了 OpenSSL 库;
(2). 检查 SSL 的版本
https://dev.mysql.com/doc/refman/5.7/en/secure-connection-protocols-ciphers.html
MySQL 的安全链接使用的是 TLS 协议:

使用了 OpenSSL 1.0.1+ 的库, MySQL 支持 TLSv1、TLSv1.1、TLSv1.2;
如果使用了 yaSSL 库, MySQL 支持 TLSv1、TLSv1.1;[……]

READ MORE

「IAM」- 目录服务 | Directory Service

在计算机中,目录 Directory 和文件夹 Folder 是一个意思,Directory 是早期的叫法(其为 DOS 时期的称呼),Folder 是后来的叫法(其为 Windows 时期的称呼)。—— 注意,要理解“目录 Directory”词语本身的含义,简而言之,其为一种词目,其为一种索引结构,……。该文章提及的“目录”与操作系统的文件夹毫无关系,甚至在操作系统中使用的“目录”一词会对我们理解该文章内容产生干扰。
认识
目录服务,Directory Service,其用于管理、组织、定位每个条目与网络资源,例如,卷、目录、文件、打印机、用户、分组、设备、电话号码、……。简而言之,Directory Service,就像书籍的目录,能够为存储各种网络资源的信息,并方便我们进行检索。
组成
则是服务协议,由两部分组成:(1)目录数据库、(2)一套能够访问和处理数据库信息的协议;
目录数据库
除了关系数据库,还有目录数据库。目录能够被理解成是一种为查询、浏览、搜索的数据库。
目录数据库主要用于存储较小的信息(如姓名、电话主机名等),同时具有很好的读性能,但在写性能方面比较差,所以不适合存放那些需要经常修改的数据;
目录协议
目录服务器(Directory server,Name server)是提供 Directory Service 的服务器。DNS 就是种 Name server —— 将名称解析为网络地址;
构造
During the 1980s, the ITU and ISO created the X.500 set of standards for directory services, initially to support the requirements of inter-carrier electronic messaging and network-name lookup.
但是 X.500 目录协议功能非常臃肿,消耗大量资源,无法做到快速查询且不支持 TCP/IP 协议网络。The Lightweight Directory Access Protocol (LDAP) is based on the X.500 directory-information services, using the TCP/IP stack and an X.500 Directory Access Protocol (DAP) string-encoding scheme on the Internet.
针对目录服务的实现,有很多软件,如下取自 Confluence 支持的目录协议,仅为展示:

Apache Directory Server[……]

READ MORE

「MySQL」- 操作数据库 | Database | Schema

增 | 创建数据库
MySQL 5.7 Reference Manual / CREATE DATABASE Syntax
权限要求:创建数据库时需要 CREATE 权限。
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

[create_specification] …

create_specification:

[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name

CREATE DATABASE 语句用于创建数据库,CREATE SCHEMA 与 CREATE DATABASE 意义相同。
没有指定 IF NOT EXISTS 的话,如果库已经存在则会产生错误。
在 MySQL 5.7 中,在具有活动的 LOCK TABLES 语句的 session 中,不允许使用 CREATE DATABASE。
create_specification用于指定数据库的一些特征。数据库的默认特征存储在数据库文件夹中的 db.opt 文件中:

CHARACTER SET 用于指定数据库默认的字符集。
COLLATE 用于指定数据库默认的校对规则。

Section 10.1, “Character Set Support”,中讨论了更多有关字符集和校对规则的内容。
MySQL 中,数据库被实现为包含与数据库中的表相对应的文件的目录。由于首次创建数据库时并没有表,所以 CREATE DATABASE 实际上只是在 data 目录下创建了一个文件夹和一个 db.opt 文件。数据库名的命名规则在Section 9.2, “Schema Object Names”中有描述。如果数据名中包含特殊字符,那么数据库文件夹的名字包含这些特殊字符的编码版本,相关的描述位于Section 9.2.3, “Mapping of Identifiers to File Names”
如果手动在 data 目录中创建一个文件夹(比如使用 mkdir 命令),MySQL 会将其视为一个数据目录,并在 SHOW DATABASES 中显示。
通过 mysqladmin 创建
mysqladmin 命令也可以用于创建数据库。
删 | 删除数据库
How to Delete a MySQL Database

DROP DATABASE Flowers;

改 | 修改数据库
数据库重命名
How to rename[……]

READ MORE

「CONTAINER-IMAGE」- 构建镜像

通过 docker build 命令
通过 docker build 构建
构建上下文(Build Context)
=
Docker 为 Client/Server 架构,构建命令 docker build 实际由 Docker Server 负责执行,而 Docker Clinet 只负责发送请求;
因此参与构建的文件需要发送到 Docker Server 中,这样 Docker Server 才能进行构建,这些文件就是构建上下文(Build Context);
需要在命令行中指定 Build Context 信息,即要参与构建的文件。然后 Docker Client 会将这些文件打包并发送到 Docker Server 以进行构建。可以直接指定目录、归档文件、Git 仓库。如果使用 Git 仓库,Docker Client 会先拉取代码,然后打包上传;
潜在问题
#1 构建时间过长、内存网络资源占用较多 如果在 Build Context 中的内容占用较大空间,比如具有很多构建产出临时文件,那么全部上传到 Docker Server 时会增加网络传输时间以及消耗带宽内存资源
#2 镜像大小增加,影响启动速度 有些镜像在构建时,直接复制 Build Context 的内容(虽然应该由 Dockerfile 负责,但是通过 .dockerignore 可以避免),这将当之镜像大小增加,占用更多磁盘空间,并且还会影响启动速度;
#3 暴露敏感信息 某些内容属于敏感信息,比如在编译或加密前的明文信息,应避免直接复制到镜像中。应该始终将这些目录排除在外;
#4 构建缓存失效(潜在问题) 如果某些非必要文件经常变更,比如构建临时输出,当复制到 Docker Server 中时,那么在构建时将无法利用上次构建缓存;
解决办法
这些问题,通过控制发送到 Docker Server 中的内容,可以得到解决。这可以通过 .dockerignore 文件解决;
通过 docker commit 命令(不推荐)
类似于版本控制系统的提交命令,比如 git commit 命令;
创建容器 -> 修改 -> 提交
使用 docker commit 命令提交修改过的容器。该命令只提交与之前差异的部分;
还可以使用 -a 选项指定作者,选项 -m 指定提交信息;
使用 docker inspect 命令查看镜像信息;
访问 docker commit 查看 docker commit 命令的所有选项;
通过 docker import 导入
docker import | Docker Documentation How t[……]

READ MORE

「MySQL」- 查询性能分析

问题描述
本文介绍如何分析 SQL 语句性能。
使用 SHOW PROFILES 语句

mysql -h 192.168.50.34 -u db_veryeast_cn -p”your-password” -P “your-port-number” \
-e ‘set profiling=1; SELECT `id` FROM `table-name`; show profiles;’

# 输出中的 Duration 列是以秒为单位(官方文档上并没有说,大家大家都是这么猜的,看起来也是这么回事)

参考文献
How To Use MySQL Query Profiling MySQL Performance Schema/14.1 Query Profiling Using Performance Schema MySQL Show Profiles duration format?[……]

READ MORE

「Jenkins」- 授予用户可以访问的项目

问题描述
我们希望将构建权限赋予开发人员(或项目组负责人),这需要以 Job 为粒度进行分配(即赋予用户某个项目或某些项目)。
将构建权限赋予开发人员,而运维人员则为开发人员提供好用的工具。
解决办法
插件名称:Role Strategy Plugin
第一步、创建用户
可以使用现有用户,或者创建用户:Manage Jenkins => Manage Users => Create User
第二步、创建角色
创建 Global roles 角色,因为用户需要访问页面的权限: 1)Manage Jenkins => Manage and Assign Roles => Manage Roles => Global roles 2)在 Global roles 中:在 Role to add 中创建角色,然后勾选 Overall/Read 权限;
创建 Project roles 角色,控制可以访问的页面: 1)Manage Jenkins => Manage and Assign Roles => Manage Roles => Project roles 2)在 Project roles 中:在 Role to add 中创建角色;在 Pattern 中设置角色可见的项目;,然后保存即可。
第三步、分配角色
分配 Global roles 权限给用户,使用户可以访问页面: 1)Manage Jenkins => Manage and Assign Roles => Assign Roles => Global roles 2)在 Global roles 中:在 User/group to add 中添加用户,然后勾选要赋予其的角色,保存即可。
分配 Item roles 权限给用户,使用户可以访问特定项目: 1)Manage Jenkins => Manage and Assign Roles => Assign Roles => Item roles 2)在 Item roles 中:在 User/group to add 中添加用户,然后勾选要赋予其的角色,保存即可。
附加说明(常见问题)
在 Assign Roles 中,修改用户权限之后(并保存),用户权限不会更新。需要到 Manage Roles 中保存(无需任何操作),然后用户权限才会更新。[……]

READ MORE

「对优化器使用Index Hint」

Index Hint,索引建议,索引提示,MySQL优化器有其自身的局限性,需要使用Index Hint来提示MySQL优化器如何处理查询。

什么是Index Hint
Index Hint的语法
Index Hint的几个特征
USE | FORCE | IGNORE的优先级
FULLTEXT搜索中的Index Hint
Index Hint的注意事项
参考文献

什么是Index Hint
在各种的SQL实现中,建议(Hint)是指示数据库引擎如何执行查询的附加SQL标准。所以说建议属于SQL的一部分。当然,不同的数据库引擎在实现建议有各自不同的做法。详细的内容需要参考各自数据库的文档描述。
Index Hint,用于在查询处理期间提示查询优化器,告诉查询优化器如何选择索引。
Index Hint的语法
tbl_name [[AS] alias] [index_hint_list]
index_hint_list: index_hint [, index_hint] …
index_hint: USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list]) | IGNORE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list) | FORCE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
index_list: index_name [, index_name] …
索引提示是在表名之后指定的。
USE INDEX(index_list)告诉MySQL只使用某个索引来查找表中的行。IGNORE INDEX(index_list)告诉MySQL不要使用某些特定索引。FORCE INDEX类似于USE INDEX(index_list),另外还假设表扫描代价很高。换句话说,只有在无法使用索引来查找表中的行时,才使用表扫描。
如果EXPLAIN显示MySQL使用了可能索引列表中的错误索引,使用Index Hint是非常有用的。
index_name必须使索引名,不能使列表。index_name可以是索引名的前缀,但这个前缀必须是唯一的,如果使用这个前缀找到了两个匹配的索引名,则会触发错误。
下面的SQL是两个简单的使用案例:

SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=[……]

READ MORE

「Groovy」- 常用 List 操作

List
Groovy List Tutorial And Examples A simple way to pretty print nested lists and maps in Groovy. Groovy – subList() – Tutorialspoint Combine two lists How to remove Duplicate Values from a list in groovy – Stack Overflow Java ArrayList insert element at beginning example List (Groovy JDK enhancements) Remove null items from a list in Groovy – Stack Overflow
该笔记将记录:在 Apache Groovy 中,常用 List 操作,以及常见问题处理。
定义列表 | def

def foo = []
def myList = [“Apple”, “Banana”, “Orange”]
println myList.class // class java.util.ArrayList

基本操作(增删改查)
增:向 List 中添加元素

list.add(element)

// 将元素添加到最开始
list.add(0, element)

// 连接两个列表
[“a”, “b”, “c”] + [“d”, “e”, “f”]

删:移除 List 中的元素

lst.remove(2) // 删除第 3 个元素

改:修改 List 中的元素:

list.set(2, 11) // 将第 3 个元素修改为 10

获取 | get, getAt, …
Groovy – collect() – Tutorialspoint

list[2]
list.get(2)
list.getAt(2)

// 获取子列表
list.subList(2, 5) // 获取第 3 到 5 间的元素

// 是否包含元素
list.contains(element)

// 获取首个元素或最后的元素
list.first()
list.last()

// collect() | 获取满足条件的元素

lst.collect {element -> return element * element}

弹出与压入(push & pop)

// pop
def list = [“a”, false, 2]
assert list.[……]

READ MORE

「lldap」- Light LDAP | 轻量级的 LDAP Server 实现

认识
官网:https://github.com/lldap/lldap 文档:https://github.com/lldap/lldap 仓库:https://github.com/lldap/lldap
Light LDAP implementation. 简而言之,LLDAP 是个轻量级的 LDAP Server 实现,目标是简化安装、简化管理、降低资源消耗、屏蔽 LDAP 复杂性。
组成
配置文件
Configure the server by copying the lldap_config.docker_template.toml to /data/lldap_config.toml and updating the configuration values (especially the jwt_secret and ldap_user_pass, unless you override them with env variables). Environment variables should be prefixed with LLDAP_ to override the configuration.
If the lldap_config.toml doesn’t exist when starting up, LLDAP will use default one. The default admin password is password, you can change the password later using the web interface.
Secrets can also be set through a file. The filename should be specified by the variables LLDAP_JWT_SECRET_FILE or LLDAP_KEY_SEED_FILE, and the file contents are loaded into the respective configuration parameters. Note that _FILE variables take precedence.
Web UI
Database
By default, the data is stored in SQLite, but you can swap the backend with MySQL/MariaDB or PostgreSQL.
构建
low resources, 500m, 1Gi
参考 lldap/lldap/Installation/With Docker 文档,以实现通过 D[……]

READ MORE

「MySQL」- Stored Objects

Event Scheduler
文档 | https://dev.mysql.com/doc/refman/8.4/en/event-scheduler.html
示例:

CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT ‘Clears out sessions table each hour.’
DO
DELETE FROM site_activity.sessions;[……]

READ MORE

「Jenkins」- 开源自动化服务器 | The Automation Server

认识
官网:https://www.jenkins.io 文档:https://www.jenkins.io/doc/book 仓库:https://github.com/jenkinsci/jenkins
Jenkins 是个独立的开源自动化服务,可用于自动执行与构建,测试,交付,部署软件相关的各种任务。简而言之,除了软件工程自动化之外,针对那些能够模式化的、能够通过代码描述的工作,皆可交给 Jenkins 来完成。
组成
WIP
构建
其通过本机系统软件包、Docker 安装,甚至可以在安装 JRE 的任何机器上独立运行。
应用
通过 Jenkins 服务,实现项目的自动化构建,完成日常自动化任务。简单说,我们仅需要编写和提交代码,剩下的重复性工作(打包、测试、发布、通知)将由 Jenkins 自动完成。所以,借助 Jenkins 服务,我们仅需要专注于程序代码的编写,无需再分心于重复性工作。[……]

READ MORE

「mysql_config_editor」-

mysql_config_editor,用于设置身份验证凭据存储(帐号密码)信息在,将其保存在$HOME/.mylogin.cnf中,该文件是加密的。
.mylogin.cnf保存在当前用户的主目录。该文件由MySQL客户端程序读取,用户获取连接到MySQL服务器的身份验证凭据。
命令行语法格式
mysql_config_editor [program_options] command [command_options]
program_options 由常用选项组成。
command 在.mylogin.cnf登录路径文件上执行的操作。例如,设置写入文件的登录路径,删除删除登录路径,并打印显示登录路径内容。
command_options 特定于命令的任何附加选项,例如:登录路径的名子、在登录路径中要使用的值。
命令名称在程序参数集中的位置很重要。例如,这些命令行具有相同的参数,但会产生不同的结果:

#!/bin/bash

# 显示一个通用的mysql_config_editor帮助消息,并忽略set命令。
mysql_config_editor –help set

# 显示特定于set命令的帮助消息
mysql_config_editor set –help

简述
mysql_config_editor程序用于将身份认证信息存储在登录路径文件中,文件名为.mylogin.cnf,该文件位于家目录下,Windows下位于%APPDATA%\MySQL目录中。MySQL Client程序在连接数据库的时候获取其中的身份凭据信息。
未加密格式的.mylogin.cnf文件由选项组组成,类似于其他的选项文件。在.mylogin.cnf中每个选项组被称为”登录路径”(login path)。选项组是一个包含了某些选项(host, user, password, port, socket)的组,将登录路径选项组视为一组选项,用作要连接MySQL服务器以及要认证的帐户的信息。下面是一个未加密的例子:

[client]
user = mydefaultname
password = mydefaultpass
host = 127.0.0.1
[mypath]
user = myothername
password = myotherpass
host = localhost

当调用Client程序连接到服务器时,Client会将.mylogin.cnf与其他选项文件一起使用。其优先级高于其他选项文件,但少于客户端命令行上明确指定的选项。有关使用选项文件的顺序的信息,参见第4.2.6节“Using Option Files”:https:[……]

READ MORE

「MySQL」- 可传输表空间(大表迁移)

什么是 可传输表空间?如何进行 InnoDB 大表迁移?
需要具备的知识
文件类型 表空间(Tablespace)
什么是「可传输表空间」(Transportable Tablespace)?
允许将「表空间」从一个实例移动到另一个实例的功能。可以简单理解为:把表直接复制到另外一个实例上。没错,这里的“直接复制”指的就是物理复制(执行 cp 命令)。
在很早之前,对「InnoDB表空间」来说,这是不可能的,因为所有的表数据都是「系统表空间」的一部分。「系统表空间」就是这个样子的,很多表都在一个文件里,没有办法单独对某个表进行物理复制。
在 MySQL 5.6 及更高版本中,(1)语法FLUSH TABLES … FOR EXPORT将使InnoDB表进入准备状态,以便复制到另一台服务器上;(3)在另外一台服务器上运行ALTER TABLE … DISCARD TABLESPACE与ALTER TABLE … IMPORT TABLESPACE将会将复制的数据文件引入另一个实例中。(2)单独的.cfg文件(需要与.ibd文件一同复制)用于在导入表空间时更新表的元数据(例如,space ID)。
要使用此功能,那InnoDB表必须是在innodb_file_per_table=ON的情况下创建的,因为这样每个InnoDB表才会有自己的表空间。其实就是说:当前表属于「表文件表空间」,就是每张表的数据、索引都是分离的,两张表的数据、索引不会在同一个文件中。
使用场景
1)在不对生产服务器产生额外负载的情况下,运行某些报告、汇总、统计。 2)在新的从服务器上,为表设置相同的数据。 3)在出现问题或错误后,还原表的备份版本。 4)作为一种更快速的数据移动方式,比逻辑备份还原更快。数据立即可用,而不必重新插入并重建索引。 5)将「表文件表空间」移动到具有更适合系统要求的存储介质的服务器。例如,将读写频繁的表放在SSD设备上,或在高容量HDD设备上使用大表。
操作示例
系统环境:CentOS Linux release 7.4.1708 (Core) 软件版本:mysql Ver 14.14 Distrib 5.6.45, for Linux (x86_64) using EditLine wrapper

################################################################################
# ON SOURCE
################################################################################
# 在源实例上,运行FLUS[……]

READ MORE

「MySQL」- 用户账户管理

该笔记将记录:常用的数据库用户管理(创建、删除、修改密码等等)语句;
创建用户
MySQL 8.0
MySQL :: MySQL 8.4 Reference Manual :: 15.7.1.3 CREATE USER Statement

CREATE USER ‘confluence’@’%’ IDENTIFIED BY ‘j0V2SvVpCOC’;

如果需要同个用户访问多个网段,则需要创建多个用户并使用不同的地址,然后授予相同的密码。
删除用户
MySQL 5.6 Reference Manual/DROP USER Syntax

— 使用 DROP USER 语句删除一个或多个 MySQL 帐户及其权限。
— 它从所有的授权表中,删除该帐户的权限行。所以,不需要回收权限。
— 如果删簇不存在的帐户,将发生错误。
DROP USER ‘jeffrey’@’localhost’, ‘tony’@’localhost’;;

DROP USER Syntax
内容:MySQL 中删除用户的语法。
Doc: https://dev.mysql.com/doc/refman/5.7/en/drop-user.html
DROP USER [IF EXISTS] user [, user] …
DROP USER 语句用于删除一个或多个 MySQL 帐户及其对应的权限。它从所有授权表(grant table)中删除该帐户的权限行。
要使用 DROP USER,您必须拥有全局 CREATE USER 权限或 mysql 库的 DELETE 权限。当启用了 read_only 系统变量时,DROP USER 还需要 SUPER 权限。
如果删除不存在的帐户,会产生错误。从 MySQL 5.7.8 开始,可以使用 IF EXISTS 子句,会不存在的帐户产生警告,而不是错误。
示例:

DROP USER ‘jeffrey’@’localhost’;

— 帐户名称的 hostname 部分,如果省略,则默认为“%”。

注意:
DROP USER 不会自动关闭任何打开的用户会话。如果登录的用户被删除,直到该用户退出以后该语句才会生效。一旦会话关闭,用户将被删除,用户下一次登录将失败。 DROP USER 不会自动删除或失效旧用户创建的数据库或对象。如果存储过程或视图的 DEFINER 属性为被删除的用户。如果在 DEFINER 的安全上下文中执行,则尝试访问此类对象可能会产生错误。
修改用户
针对用户进行重命名
修改 Host 信息(database administra[……]

READ MORE

「mysqldumpslow」

内容:介绍mysqldumpslow工具。
MySQL Version 5.7
mysqldumpslow是用于分析MySQL慢查询日志的工具。可以简化慢查询日志的分析。 mysqldumpslow会将相似的查询分到一起,这里的相似是指的只用数字和字符串参数不同。 关于MySQL慢查询日志相关内容请查看:《MySQL慢查询日志》
引用内容:

Doc:
https://dev.mysql.com/doc/refman/5.7/en/mysqldumpslow.html

命令行选项、语法、参数含义
mysqldumpslow [options] [log_file …]
参数解释
以下是mysqldumpslow支持的选项:

-a

mysqldumpslow会将“相似”的查询分到一起,这里的“相似”是指的只用数字和字符串参数不同。
而-a阻止这种处理,不要会将数字抽象成‘N’,也会将字符串抽象成‘S’。Demo:

#!/bin/sh

cat /var/log/mysql/slow-query.log
# ……
#
# # Time: 2017-04-01T03:08:55.987817Z
# # User@Host: root[root] @ localhost [127.0.0.1] Id: 106
# # Query_time: 2.549367 Lock_time: 0.000070 Rows_sent: 30 Rows_examined: 3226494
# SET timestamp=1491016135;
# SELECT * FROM tbk_article
# WHERE 1
# ORDER BY sort DESC,id DESC
# LIMIT 0, 30;
#
# ……

mysqldumpslow /var/log/mysql/slow-query.log
# ……
#
# Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts
# Time: N-N-01T03:N:N.242579Z
# # User@Host: taobaoke[taobaoke] @ localhost [] Id: N
# # Query_time: N.N Lock_time: N.N Rows_sent: N Rows_examined: N
# SET timestamp=N;
# SELECT * FROM tbk_artic[……]

READ MORE

「PHP」- Composer

认识
社区的开源作者们写了很多 PHP 工具库。而我们想在项目里使用某个 PHP 工具库,因为这些工具库强大。嗯,那就下载这些工具库,在项目中引入相关文件,然后就可以在我们的程序中使用相应的类或函数了,享受着这些工具库带来的便利,而不用开发自己的工具库;
但如果工具库很多呢?那我们要手动引入很多相关文件,这在管理工具库时会很麻烦。而且,如果这些 PHP 工具库之间还存在依赖关系呢?管理起来就更麻烦了;
这时 Compose 就出现了。Composer,用于管理 PHP 依赖管理。可以帮助我们声明、管理、安装 PHP 项目的依赖。Composer 非常像 Bundler (Ruby)、npm (Node)等工具。它会帮我们下载这些工具库,并处理好依赖关系,而我们只需要在程序中引入一个名为 autoload.php 的入口文件,然后就可以使用这些库了。
构建
这里就不再赘述了,官方和很多的博客中都描述了如何安装 Composer,下面会给出参考连接:

Download Composer
CSDN/ 吕秀军 /Composer 安装-> 使用
在 Debian 中,我会直接使用软件包管理器安装:apt-get intsall composer。其他的 Linux 发行版中也是类似的思路;

不再列举更多了。安装分为”局部安装“和”全局安装“,请参考其他教程。我使用的是“全局安装”;
安装结束之后,我获得了 composer 命令。然后,就可以通过 composer 命令来安装工具库了。看下文;
如何使用 Compser?
首先随便找一个目录,一个用作”初体验“的目录,我们就姑且命名为 exp 目录吧。进入 exp 目录,那我们随便下载一个 phpunit 吧:

# composer require phpunit/phpunit

命令执行,等待结束后,在 exp/ 下就会出现:composer.json、composer.lock、vendor/ 这两个文件及一个目录,verder/ 中保存了下载的 phpunit 工具库以及它的依赖。如果要在程序中使用 phpunit 工具库,只需要在程序中引入 vendor/ 下的 autoload.php 文件即可;
有关 Compser 的更多内容,比如搜索、安装、创建项目等等,请参考官方手册「Documentation」中的说明;
国外源与国内源
“源”是工具库的集散中心,所有的工具库都来自于”源“。当我们使用 Composer 安装一个工具库的时候,那就会到”源“中查找、下载该工具库;
官方源
https://packagist.org[……]

READ MORE

「JENKINS」- 插件 | Plugins

描述
在 Jenkins Plugins 中,提供众多的插件来扩展 Jenkins 的功能,以解决在自动化过程中遇到的多种问题(或实现某些功能);
Jenkins 插件管理,及相关解决方案;
Jenkins Plugins | https://plugins.jenkins.io/
应用
注意 | 先升级 Jenkins,再升级或安装插件
某些插件依赖于新版本的 Jenkins 服务,大批量的插件升级将导致 Jenkins 重启失败。所以,当安装(或升级)插件时,建议先进行 Jenkins 版本升级。
编写插件
WIP
安装插件
在 Jenkins 与 Jenkins Pipeline 中,我们用到的的插件,及特定问题的解决方法;
使用国内镜像站点
jenkins 插件清华大学镜像地址国内
默认 Jenkins 使用 https://updates.jenkins.io/update-center.json 下载并安装扩展,但是速度较慢;
我们可以修改为使用国内镜像站点,比如清华大学镜像站点:

Manage Jenkins / Manage Plugins / Advanced
Update Site / URL https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
Submit

如果使用 Docker 方式运行容器,则可以通过环境变量来修改插件仓库地址。 https://github.com/jenkinsci/docker?tab=readme-ov-file#setting-update-centers
删 | 卸载插件
uninstallation pending message 提示 Uninstallation pending 消息,表示需要重启 Jenkins 服务才能完成卸载操作;
禁用插件
Disabling plugins from CloudBees CI
通过手动进行禁用: 1)进入 /var/lib/jenkins/plugins 目录 2)创建 <PLUGIN_ID>.jpi.disabled 文件,以禁用插件; 3)例如:greenballs.jpi.disabled 来禁用 greenballs.jpi 插件;
或,通过 Jenkins CLI 禁用(我们仅记录,但未验证): 1)java -jar jenkins-cli.jar disable-plugin plugin1 plugin2[……]

READ MORE

「OpenSSH」- 在 Windows 中,安装 OpenSSH 服务

在 Windows 7 上,我们需要安装 OpenSSH 客户端以及服务端,即实现: 1)在 cmd 中使用 ssh 命令,而无须安装第三方远程客户端; 2)在 Windows 7 中运行 sshd 服务,在其他主机中通过 ssh 远程 Windows 7 主机。
第一步、下载并安装
访问 GitHub/PowerShell/Win32-OpenSSH/Releses 页面,下载 OpenSSH-Win64.zip 二进制包(或者根据需要下载其他版本)。
将二进制包解压到 C:\Program Files\ 中,并以 OpenSSH on Windows 7 命名。该包中包含客户端(ssh)与服务端(sshd)命令。
第二步、配置客户端
为了能够在 cmd 中使用客户端命令(比如scp、ssh),我们需要配置环境变量。
在 Windows 7 中,计算机 => 属性 => 高级系统设置 => 环境变量…,这里不再深入展开。
如果仅需使用客户端命令到此步骤即可。
第三步、配置服务端
安装服务
进入安装目录,C:\Program Files\OpenSSH,执行 powershell -executionpolicy bypass -file install-sshd.ps1 命令安装服务。
执行 .\ssh-keygen.exe -A 命令,生成主机密钥,该密钥用于服务启动。
防火墙配置
如果开启 Windwos 防火墙,需要放行某些端口,这里不再深入展开。
启动服务
启动服务:net start ssh-agent,net start sshd
配置服务开启动,Set-Service sshd -StartupType Automatic,Set-Service ssh-agent -StartupType Automatic
验证服务有效
在任务管理器中查看sshd与ssh-agent进程是否存在,以确定服务是否正常启动。
然后,使用 ssh 命令远程该主机,以验证能够通过 ssh 访问 Windows Shell。
常见错误汇总
RSA Could not save your public key in PROGRAMDATA\\ssh/xxxxxxx: No Such file of directory”
问题描述: 在执行 .\ssh-keygen.exe -A 命令时,产生该错误。
问题原因: 目录__PROGRAMDATA__\ssh不存在,需要手动创建。
解决办法: 创建__PROGRAMDATA__\ssh目录。
发生系统错误 1067(System error[……]

READ MORE

「ssh」

ssh 是 OpenSSH 的客户端,是一个远程登录程序,用于登录服务器并执行命令。它的目的是在两个不信任主机在非安全的网络上提供一个安全的加密通讯。也可以在安全隧道上进行 X11 连接、任意 TCP 端口、UNIX 域套接字的转发。
命令行语法格式
ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file]

[-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command]

用户登录远程主机时,需要指定主机地址及可选的用户名。同时,用户需要使用几种方法之一(见下文)提供身份信息。
如果指定了 command,则会在远程主机上执行 command,否则执行登录 SHELL。
命令行选项及含义
ssh 命令支持的命令行选项如下:
-1 Forces ssh to try protocol version 1 only.
-2 Forces ssh to try protocol version 2 only.
-4 Forces ssh to use IPv4 addresses only.
-6 Forces ssh to use IPv6 addresses only.
-A Enables forwarding of the authentication agent connection. This can also be specified on a per-host

basis in a configuration file.

Agent forwarding should be enabled with caution. Users with the ability to bypass file permissions on
the remote host (for the agent’s UNIX-domain socket) can acc[……]

READ MORE

「MySQL」- 用户管理 | 权限管理

针对 MySQL 帐号信息,其存储在 mysql 库的表中。
for MySQL 5.7
MySQL Manual/Account Management Statements MySQL Manual/MySQL User Account Management
MySQL 中关于用户账户管理的内容涉及了以下的几个方面:

ALTER USER Syntax
CREATE USER Syntax
DROP USER Syntax: 用户删除语法。
RENAME USER Syntax
SET PASSWORD Syntax

授与 | GRANT
MySQL 5.7 Reference Manual / GRANT Statement | https://dev.mysql.com/doc/refman/5.7/en/grant.html
部分权限,例如 REPLICATION CLIENT, REPLICATION SLAVE 等等,需要使用 *.* 进行全局授权,而无法针对库或表进行操作。否则会提示 … ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES[1221] … 信息
SHOW GRANTS
13.7.5 SHOW Syntax / 13.7.5.17 SHOW GRANTS Syntax | https://docs.oracle.com/cd/E17952_01/mysql-5.0-en/show-grants.html MySQL 8.4 Reference Manual / … / SHOW GRANTS Statement | https://dev.mysql.com/doc/refman/8.4/en/show-grants.html

mysql> SHOW GRANTS FOR ‘jeffrey’@’localhost’;
+——————————————————————+
| Grants for jeffrey@localhost |
+——————————————————————+
| GRANT USAGE ON *.* TO `jeffrey`@`localhost` |
| GRANT SELECT, INSERT,[……]

READ MORE

「BLOCKCHAIN」- 区块链 | Blockchain |

认识
区块链(Blockchain),是一种去中心化的分布式数据库技术。其能够记录交易、交换数据和信息,同时确保所有记录不可篡改和被修改。其由多个节点共同维护,采用链式结构进行组织,每个区块包含前一个区块的哈希值,形成不可篡改的数据记录。
组成
共识机制(Consensus Mechanism):区块链网络中用于确认交易有效性的一种机制,包括工作量证明、权益证明、共识投票等方式。
针对区块链的实现,其需要很多关键技术。如下是实现区块链的部分关键技术:

加密算法:包括哈希函数和公钥 / 私钥加密技术,用于数据的安全和完整性。
共识算法:如工作量证明(PoW)和权益证明(PoS),用于验证新的交易和创建新的区块。
默克尔树:数据结构,用于高效、安全地验证大量数据的完整性。
智能合约:编程代码,当预定条件满足时自动执行,用于自动化和去信任化的处理交易。
P2P 网络:区块链的所有通信都在此网络中进行,无需中央服务器。
分布式网络:这是构建区块链的基础,每个参与者都有整个区块链的副本。

Layer 1 and Layer 2
区块链的 Layer 1(一层) 和 Layer 2(二层) 是为了解决网络可扩展性、安全性和去中心化之间的平衡问题而提出的分层架构。
Layer 1 是区块链的底层协议,直接处理交易并维护网络的安全性和共识机制。例如:比特币、以太坊、Solana 等公链。 Layer 1:大额转账、智能合约部署、关键资产存储。
Layer 2 是在 Layer 1 之上构建的辅助协议,通过将交易移至链下处理,减轻主链负担,提升速度和降低费用,最终将结果锚定回主链。 Layer 2:高频交易(如游戏、DeFi)、小额支付、NFT 铸造。
引入 Layer 2 的原因 解决拥堵:以太坊主链在高负载时费用飙升,Layer 2 能显著降低成本。 保留安全性:相比完全独立的链,Layer 2 仍锚定主链的安全保障。 灵活创新:允许实验性技术(如隐私增强)在不改动主链的前提下实现。
性质
区块链的去中心化性质意味着没有单个实体控制它,而是由网络中的所有参与者共同维护。
区块链可以被视为一个不可逆转的数字账本,其中每个记录被称为一个“区块”,它们被链接在一起形成一个不可变的“链”;
区块链的安全性和不可篡改性来自于其共识机制,这是一种算法,通过验证和确认所有交易,确保每个节点都有相同的记录。这种机制可以防止欺诈和攻击,保护数据的完整性和安全性;
区块链技术的优点包括去中心化、安全性、透明度、可追溯性和高效性。然而,它也存在一些挑战,如可扩展性、能源效率和标准化等问题。随着区块链技术的不断发展和成熟,它将继续在各个领域发挥重[……]

READ MORE

「MySQL」- 导出数据字典

什么是数据字典
先来一段WIKI解释(有问题找WIKI)

A data dictionary, or metadata repository, as defined in the IBM Dictionary of Computing, is a ”
centralized repository of information about data such as meaning, relationships to other data, origin, usage, and format”.

通常情况下,我很少维护文档式的数据字典(如EXCEL),一般都是在生产库中维护,保证生产库的注释都是最新的,但是应开发的需要,有时候需要导出文档式的数据字典。下面就介绍如何导出数据字典。
为什么需要数据字典

方便开发查阅。如果数据字典只是存在于数据库的,查阅会非常麻烦。尤其是分库以后,查阅更繁琐。
方便维护。如果要修改列的注释、添加详细说明,使用数据字典来维护会非常的方便、安全,也无需执行alter语句来修改注释。

为什么是“导出”数据字典
按道理来讲数据字典在最开始就应该存在的,之所以“导出”,完全是因为在“洗锅”。
最初的时候没有维护单独的数据字典,注释只存在于数据库中,等项目大了以后,出现各种问题了,才发现我们需要一份数据字典。
每次都是,出现问题了,人们才会重视。
使用 Navicat + INFORMATION_SCHEMA.COLUMNS 导出数据字典
我最开始用的是INFORMATION_SCHEMA.COLUMNS表,后来被标题党“MySQL利用Navicat导出数据字典”唬了一下,实际上做法是一样的。
导出单个库的数据字典 首先,执行如下SQL:

SELECT TABLE_NAME AS ‘表名’, COLUMN_NAME AS ‘列名’, COLUMN_TYPE AS ‘列类型’,COLUMN_COMMENT AS ‘列注释’
FROM information_schema.columns
WHERE TABLE_SCHEMA = ‘demo’;

— 当然你还以加入其他的列,比如IS_NULLABLE等等。

然后,利用Navicat提供的数据导出功能,将查询结果直接导出到EXCEL中。这样我们就得到了demo库的数据字典。
导出全部库的数据字典 可以导出全部库的数据字典(本质一点没变,具体根据需求处理):

SELECT TABLE_SCHEMA AS ‘数据库库名’, TABLE_NAME AS ‘表名’, COLUMN_NAME AS ‘列名’,[……]

READ MORE