【notes5】git/docker,jenkins/gerrit,mysql/redis/ldap/snmp

文章目录

  • 1.git
    • [1.1 常用指令](#1.1 常用指令)
    • [1.2 commit规范](#1.2 commit规范)
  • 2.docker
    • [2.1 pull/image,run/ps(进程),exec/commit](#2.1 pull/image,run/ps(进程),exec/commit)
    • [2.2 save/load](#2.2 save/load)
    • [2.3 Dockerfile](#2.3 Dockerfile)
  • 3.jenkins
    • [3.1 jenkins-docker配置](#3.1 jenkins-docker配置)
    • [3.2 jenkins与gitlab配置](#3.2 jenkins与gitlab配置)
      • [gitlab与jenkins的access token配置](#gitlab与jenkins的access token配置)
      • [新建jenkins job和配置job](#新建jenkins job和配置job)
      • [jenkins pipeline script配置](#jenkins pipeline script配置)
      • jenkins&gitLab集成环境验证
  • 4.gerrit
  • 5.mysql
    • [5.1 多表关系](#5.1 多表关系)
    • [5.2 多表查询](#5.2 多表查询)
    • [5.3 事务](#5.3 事务)
    • [5.4 优化/备份/恢复](#5.4 优化/备份/恢复)
  • 6.redis
    • [6.1 安装](#6.1 安装)
    • [6.2 操作](#6.2 操作)
    • [6.3 订阅](#6.3 订阅)
  • 7.ldap
    • [7.1 添加人cn](#7.1 添加人cn)
    • [7.2 添加组织ou](#7.2 添加组织ou)
  • 8.snmp
    • [8.1 mib文件](#8.1 mib文件)
    • [8.2 实例](#8.2 实例)

1.git

1.1 常用指令

shell 复制代码
git branch查看本地分支, -r查看远程分支, -a查看本地和远程,-v查看各分支最后一次提交, -D删除分支
git fetch origin arch(远程):arch(本地)
git lfs clone  #Large File Storage,在Git仓库中用一个1KB不到的文本指针来代替文件的存在,通过把大文件存储在Git仓库外,可减小Git仓库本身的体积,使克隆Git仓库的速度加快且不会损失性能

git add -A   # 全部,这样新增的文件也能stash save
git commit -m '提交信息' --no-verify    # 可以跳过代码检查
git commit --amend -m '提交信息' --no-verify    # 对上一次的提交进行修改
git log --oneline --graph   # 查看commit第一行
git status   # 查看工作区变更是红色(缓存区是绿色),新版本
git push origin dev(本地) :dev(远程) -f    # 覆盖commit
git reset --hard commithash  # 慎用,一般不带hard
git remote add/remove # 添加/删除一个远端仓库,origin名字可代替后面github仓库(这github仓库是https版本,换成ssh版本并配置key免密登录)
git ls-remote (git remote -v)

git stash save a  # 先git add -A再执行这一步后再git pull origin ,因为有冲突也能pull成功
git stash list  # 可到新分支pop此分支改动
git stash pop stash@{0}  #有冲突也pop出来了,解决冲突(updated是远程)后保存并git add这文件即标记已解决,可用git reset HEAD 文件将绿变红,最后git stash drop stash@{0}

git checkout a.html  # 还原a.html文件改动, 红色变没
git checkout -b dev   # 创建并切换到dev分支,不加-b只是切换

git pull = git fetch + git merge  # 一般不单独用merge
git push <远程主机名> <本地分支名>:<远程分支名>  # git push origin dev:dev 和 git push origin dev 等效,因为本地分支和远程分支同名可以省略冒号部分

git diff > a.patch 
git apply --reject a.patch # 尝试应用补丁(允许部分失败)
ls *.rej,rm *.rej # 手动解决冲突后,删除 .rej 文件

git add,  git commit -m "" ,  git format-patch -n1
git cherry-pick 另一分支commitid, 出现冲突,git status查看解决后git add冲突文件后git cherry-pick --continue (先git pull -p 拉取分支和tag,git remote update -p)

# 在Windows下,标准的行结尾格式是CRLF(回车符和换行符),它由一个回车符(CR)和一个换行符(LF)组成,即\r\n。
# 在Unix和类Unix系统(如Linux和macOS)中,标准的行结尾格式只使用换行符(LF),即\n。
# git 提交出现dos格式的解决方法,关闭 git 的自动换行符转换。
git config --global core.autocrlf false
shell 复制代码
内部:
git tag -a NS730-v0.01.00 -m "NS730-v0.01.00-release"  # 创建tag
git push origin NS730-v0.01.00 # 同commitid自动会有tag标志

外部:commitid关联内部
git add meta-alibaba/meta-obmc-h  # git commit/push/网页merge:[tag]模板, 合并后重复上面内部中2行

验证:
git clone -b 外部
./sync_yocto.sh 或 cp -r其他项目yocto文件夹
git submodule init 
git submodule update
进入内部,git fetch origin q:q ; git checkout q ; 一定要git status检查内外部,不然dirty
source openbmc-init-build-env meta-alibaba/meta-obmc-h , bitbake
shell 复制代码
openbmc$ git remote -v
origin	https://github.com/AspeedTech-BMC/openbmc.git (fetch)
origin	https://github.com/AspeedTech-BMC/openbmc.git (push)
openbmc$ git remote rename origin old-origin
openbmc$ git remote add origin https://172.16.11.16/ta/aspeed_2700evb.git
openbmc$ git config --global user.name "ta"
git config --global user.email "ta@m.com"
openbmc$ cat .gitignore 
build*/*
customrc
*.sw?
.repo/
.vscode/
openbmc$ git branch 
* v09.06
openbmc$ git push origin v09.06:main -f
error: src refspec v09.06 matches more than one
error: failed to push some refs to 'https://172.16.11.16/ta/aspeed_2700evb.git'
openbmc$ git show-ref | grep v09.06
cf5f451d8ffcb8eefc288ba305707f953874baf9 refs/heads/v09.06
1ae1969ea30a13640f8f4a337500da1841419325 refs/tags/v09.06
openbmc$ git -c http.sslVerify=false push origin refs/tags/v09.06:master -f
openbmc$ git -c http.sslVerify=false push --set-upstream origin --all
出现:server certificate verification failed. CAfile: none CRLfile: none,则 git config --global http.sslVerify false 改变.gitconfig的[http]字段

# 解决大文件传输中断,git clone慢
git config --global http.postBuffer 524288000  # 500MB
git config --global http.lowSpeedLimit 0       # 不限制低速
git config --global http.lowSpeedTime 999999   # 低速超时时间

1.2 commit规范

shell 复制代码
# .commit_template.txt隐藏文件:git commit进入vi界面(进入前要git config core.editor vim设一下vi模式)
[Project/Common][Feature/Bug/Enhancement/Porting/Debug/Style/Build/Docs/Refactor/Revert]: Brief oneline Summary(Less than 50 characters)

# .commit-msg-hooks.sh隐藏文件:
#!/bin/sh
str=$(cat $1)    # $1就是git commit进入里的信息即ommit_template.txt内容
python .git/hooks/commit-msg-check.py "$str"


# .commit-msg-check.py隐藏文件:
#!/usr/bin/python
import sys
support_plat = ["Common", "SR", "Lin"]
support_type = ["Feature", "Bug", "Enhancement", "Porting",
                "Debug", "Style", "Build", "Docs", "Refactor", "Revert"]
format_dict = {"Description": False, "Root Cause": False,
               "Solution": False, "JIRA": False, "Test": False}

line = sys.argv[1]
if line.startswith("Merge branch"):
    exit(0)

commit = line.splitlines()
if len(commit[0]) == 0:
    print("Reject!!!! \nFirst line of commit message must not empty! !")
    exit(1)

platform = commit[0].lstrip()[1:-1].split("]")[0]
types = commit[0].lstrip()[1:-1].split("]")[1].lstrip()[1:]
if types not in support_type:
    print("Reject!!!! \nPlease select type in {} !".format(support_type))
    exit(1)

if platform not in support_plat:
    print("Reject!!!! \nPlease select platform in {} !".format(support_plat))
    exit(1)

for index in range(1, len(commit)):
    commit_line = commit[index]
    if commit_line.startswith("[Description"):
        format_dict["Description"] = True
    if commit_line.startswith("[Root"):
        format_dict["Root Cause"] = True
    if commit_line.startswith("[Solution"):
        format_dict["Solution"] = True
    if commit_line.startswith("[JIRA"):
        format_dict["JIRA"] = True
    if commit_line.startswith("[Test"):
        format_dict["Test"] = True

for key, value in format_dict.items():
    if not value:
        print("Reject!!!! \nLost \"{}\" field in commit!".format(key))
        exit(1)
exit(0)


# openbmc-init-build-env文件(fb)或setup文件(ocp):拷贝安装上面文件
title_num=$(sed -n '/\[commit\]/p' .git/config | wc | awk -F' ' '{print $1}')
file_num=$(sed -n '/template = \.git\/commit_template.txt/p' .git/config | wc | awk -F' ' '{print $1}')
if ! ([ "$title_num" -gt 0 ] && [ "$file_num" -gt 0 ]) ; then
    echo "[commit]" >> .git/config
    echo "        template = .git/commit_template.txt" >> .git/config
fi

if [ -f ".commit_template.txt" ];then
    cp .commit_template.txt .git/commit_template.txt
fi

if [ -f ".commit-msg-hooks.sh" ];then
    chmod 777 .commit-msg-hooks.sh
    cp .commit-msg-hooks.sh .git/hooks/commit-msg ###### git commit回车触发
fi

if [ -f ".commit-msg-check.py" ];then
    chmod 777 .commit-msg-check.py
    cp .commit-msg-check.py .git/hooks/commit-msg-check.py
fi

#如下在项目目录:
#source openbmc-init-build-env meta-hua/meta-whitebox
#cat .git/config
#[commit]
#        template = .git/commit_template.txt

ssh可免密码(git@),但要配置公钥到github上。https免密:git config --global credential.helper store (除第一次,后面缓存,git config --global --list查看)

如下一行(linux中没有.exe)是在.ssh文件夹中(原来只有known_hosts文件)生成两个id文件。

如下配置输入ssh localhost就不要登录密码,-t参数指定要生成的密钥类型,-P密码"表示没有,-f是密钥的生成后的保存文件位置。

shell 复制代码
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa  # 生成如下两个文件
shell 复制代码
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

2.docker

2.1 pull/image,run/ps(进程),exec/commit

docker和vmware虚拟机一样由三部分构成:镜像(image)是像ubuntu镜像文件(iso,img文件),容器(ps)是一个正在运行的虚拟机,仓库是存放镜像文件场所(dockerhub)。tar文件类似于vm使用时的vmdk文件,可将一个镜像直接保存成一个tar文件,别人load重新加载成一个镜像,run起来成了一个虚拟机。Dockfile是一个很短的配置文件,通过写"如何构建"的步骤来指定一个镜像如何构建的,通过docker build指令可将Dockfile构建成一个镜像。仓库保存了一些公有镜像如ubuntu/nginx/mysql/tomcat镜像等。

ubuntu安装命令:sudo apt install docker.io,网站:play with docker。docker run -d -p 81:80 nginx指定外部81端口同理点击81跳转到nginx网页首页(nginx的默认端口是80)。

如下再次点击外部80端口。

如下暂时用不到81,容器里内容修改后要commit成新镜像m1,和pull下来的nginx镜像并列。

当前目录自己新增index.html(里面写着wai bu de wen jian)和Dockerfile两文件,将原来nginx里面index.html替换了,如下vi Dockerfile。

点击外部100号端口如下:上面为dockerfile build成一镜像run成为一容器。

2.2 save/load

docker rm m2将m2镜像直接删除,提示有个容器基于这镜像无法删除,那将容器(container id)也删了。docker save + 镜像id,不是容器id。

删了容器还要删除镜像m2,docker load使m2镜像又从tar文件重新拿过来了。文件映射-v就是将一些静态文件放外面,在外面(pwd)修改文件(因为是映射的)里面文件也会跟着变化。

2.3 Dockerfile

FROM:指定当前镜像基于哪个镜像,必填,一行就可以构建一个镜像。镜像像程序,容器像进程。

WORKDIR:指定接下来shell语句运行在哪个路径下,如下alpine镜像下肯定没有/app这个目录,自动创建。

COPY:将当前宿主机文件拷贝到镜像中去。

RUN:构建容器时运行这脚本,当前工作目录就是/app,所以如下321写入/app/1.txt

CMD:指定整个容器启动起来运行脚本,运行完后整个容器生命周期结束(tail -f 阻塞式)。

如下必须命名为Dockerfile,1.txt里面原本内容有123。

如下指定输出镜像名test,最后的点表示dockfile文件位于当前目录下。

进入docker默认是root用户,增加自己的同名目录并切换再编译。

编译实例

如果出现source not found,如上vim后面加入bash,并添加如下,加入默认/bin/sh指向bash。

shell 复制代码
sudo docker build -t amdturin
sudo docker run -it -u 1003:1003 -v /home_a/si:/home/si amdturin (docker images查看,因为是latest不用指定版本号) /bin/bash

在docker内ls -l,如下1003就是用户名和group名。

如下在容器中切换到了username用户,第3/4行分别是gitlab/github。. setup sp7。

x.bbappend找不到bb,find后没有,注释为x.bbappend.bk。

3.jenkins

3.1 jenkins-docker配置

jenkins镜像和nginx一样,code push到git上,git通过hook触发构建/测试/部署就是CI(持续集成)CD(持续交付)工具即jenkins(需提供一台运行jenkins的机器)。官网https://www.jenkins.io/下载jenkins,可选择适合你自己系统的版本,也可选择不依赖于系统的docker(前提本机安装了docker)或war包(本机安装了java),如下开启`服务端`。

执行如上命令出现密码,复制这串密码,浏览器打开http://localhost:8080客户端),粘贴到管理员密码里。点击安装推荐插件,创建管理员用户y,密码123,到这里jenkins已经安装完成了(装在win上),主要用来配合git服务器。

在指定服务器上安装docker,使用docker命令进行下载jenkins-docker版本如下:

shell 复制代码
docker pull jenkins/jenkins:2.54  (docker images查看, 不指定版本就是最新的版本)

-name指定image名字。-p内部container和外部对应关系。-v外部地址和container内部地址对应关系,在container内部修改jenkins的话,外部也会更新。/etc/localtime时间同步。

shell 复制代码
docker run --privileged=true -d --name jenkins -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /home/y/jenkins_home:/var/jenkins_home/ -v /etc/localtime:/etc/localtime jenkins/jenkins:2.54 (或v4)
shell 复制代码
docker exec -u 0 -it jenkins bash   # 进入docker container内部,需安装cppcheck等命令
docker save --o jenkins_v4.tar jenkins/jenkins:v4  # 保存docker images为tar包命令
docker load -input jenkins_v4.tar  # 加载tar包为docker images命令

3.2 jenkins与gitlab配置

gitlab与jenkins的access token配置

GitLab配置Access Token,用于jenkins连接GitLab获取GitLab API接口:点击右上角用户头像Edit profile,再点击左侧Access Tokens ,命名为gitlab_jenkins,Select scopes全部勾选上,点击创建产生如下字符串。

如下Manage Jenkins需要admin admin用户。如下Add是一个按钮。

新建jenkins job和配置job

jenkins的Dashboard仪表盘界面点击New Item(要登陆),可新建job或者复制已有job,直接复制已有job,拷贝后的job不要运行build,避免回填错误数据到GitLab。

http://10.75.13.34:8084/job/example/,点击Advanced。

如下gitlab查看成员,只有Maintainer才有Settings。

jenkins pipeline script配置

groovy 复制代码
// 环境模块导入, 清空工作空间,groovy语言
import hudson.*
node(""){
    stage("clear workspace"){
        cleanWs()
    }
}

// 下载源码
node(""){
    stage("download code"){
        echo "download code"
        if (env.gitlabSourceBranch == null){   //当gitlab过来触发的job的话,环境变量上就会有gitlabSourceBranch字串
            git branch: "sw61", credentialsId: '18f53bc3-dc50-4178-acde-d628264ee453', url: 'https://gitlab-dbd...com/bsp_diag/prj_bsp.git'   // null说明不是gitlab触发
        }else{  //gitlab做了push或merge操作时触发,credentialsId就是Access Tokens
            git branch: env.gitlabSourceBranch, credentialsId: '18f53bc3-dc50-4178-acde-d628264ee453', url: env.gitlabSourceRepoHttpUrl
        }
    }
}

// 源码cppcheck扫描
try{
    node(""){
        stage("cppcheck"){
            echo "cppcheck starting"
            pwd()
            sh "/home/cppcheck-1.75/cppcheck 4 --enable=all --inconclusive  --xml --xml-version=2 "+env.WORKSPACE+" 2> cppcheck.xml"
            publishCppcheck ignoreBlankFiles: true, pattern: 'cppcheck.xml'
            def cppcheck_file_obj = new File(env.WORKSPACE+"/cppcheck.xml")
            if (cppcheck_file_obj.isFile()){
                echo "cppcheck.xml file exist"
                result = sh returnStdout: true ,script: "cat "+env.WORKSPACE+"/cppcheck.xml"
                if (result == ""){
                    echo "analyse cppcheck.xml failure,cppcheck.xml is empty"
                    currentBuild.result="FAILURE"
                }else{
                    echo "analyse cppcheck.xml"
                    cppcheck_result = sh returnStdout: true ,script: "cat "+env.WORKSPACE+"/cppcheck.xml | grep 'cppcheck version'"
                    if(cppcheck_result == ""){
                        echo "analyse cppcheck.xml failure,cppcheck.xml format error"
                        currentBuild.result="FAILURE"
                    }else{
                        final_result = sh returnStdout: true ,script: '''cat '''+env.WORKSPACE+'''/cppcheck.xml | grep severity=\\"error\\"'''
                        if(final_result == ""){
                            echo "analyse cppcheck.xml pass"
                        }else{
                            echo "analyse cppcheck.xml failure,cppcheck.xml has error"
                            currentBuild.result="FAILURE"
                        }
                    }
                    
                }
            }else{
                echo "cppcheck.xml file not exist"
                currentBuild.result="FAILURE"
            }
        }
    }
}catch(e) {
    echo "cppcheck failure"
    currentBuild.result="FAILURE"
}

// 源码编译
try{
    node(""){
        stage("compile code"){
            echo "compile code"
            sh "make"   //在docker里编译
        }
    }
}catch(e) {
    echo "compile code failure"
    currentBuild.result="FAILURE"
}

// 验证扫描与编译结果,成功后归档相关文件
node(""){
    stage("archive"){
        echo "archive"
        if(currentBuild.result == 'FAILURE') {
            echo "Something unexpected happened. Please inspect Jenkins logs. Skip archive."
        }else{
            sh '''
            mkdir build
            cp cppcheck.xml build/
            cp *.ko build/
            tar -zcf archive.tar.gz build/
            '''
            archiveArtifacts artifacts: '*.tar.gz', followSymlinks: false
        }
    }
}

// 根据扫描和编译结果,回填数据到GitLab
stage("commit gitlab"){
    echo "commit gitlab"
    if(currentBuild.result == 'FAILURE') {
        updateGitlabCommitStatus(name: 'sw61_bsp_build', state: 'failed')
    }else{
        updateGitlabCommitStatus(name: 'sw61_bsp_build', state: 'success')
    }
}

jenkins&gitLab集成环境验证

GitLab推送修改至仓库新分支,验证push event可触发jenkins job,jenkins回填数据至GitLab。

gitlab触发docker_jekins(部署在34服务器上),34 ssh到33编译服务器进行编译回传img到34,34将img传到测试的机器上(测试机器上有测试用例代码文件),34拷完img后触发40测试平台服务器(40是大docker前后端,小docker测试环境 【 ssh/串口/PDU到测试机器上 ,python3 测试用例 】 ,34传来的是选择哪一个小docker ),40将执行pass显示结果传给34,34传给gitlab。

4.gerrit

用github账户登录https://gerrit.openbmc.org,gerrit页面Setting - Contact Information,Profile下填Full Name,Email Address填New Email Addr,SEND VERIFICATION确认。Setting - New SSH Keys参考上面gitlab免密。

BROWSE按钮选择Repositories选择项目如openbmc/bmcweb,ANONYMOUS HTTP进行git clone。gerrit进行commit时必须生成一个Change-Id,否则push到gerrit服务器时会收到错误提醒,对于仓库没有.git/hooks/commit-msg文件时,需要如下下载:

git add,git commit -s ( -s让commit信息里自动生成 signed-off-by,commit-msg自动生成Change-Id) -m " aaa" 。不能把代码提交到远程master或其他分支(这样就越过gerrit了),gerrit必须依赖refs/for/*的分支如git push origin HEAD:refs/for/master,CHANGES -> Open 查看提交是否成功,点击Reviewers, 添加审核人员 (可以添加多个),如果该项目自己也有权限,可自己打分,同时Code-Review必须是2分才能进行merge(分数不可以累加)。

当review人员收到review请求后,进入项目点击REPLY,进行Code-Review打分,Submit提交打分,代码查看:BROWSE - Repositories - 项目名 - BROWSE - 分支。

5.mysql

如下中间蓝框里一个数据库相当于一个excel表,紫色框里一个table相当于excel表里的一个sheet。use数据库相当于双击打开excel表格,select查看函数返回值,desc全称description,like复制表结构,change 旧字段 新字段 新类型。char不用动态变化,效率高。

数据库名字不建议修改,用数据库备份改名(新建一个数据库,把原数据库数据复制过来)。mysql中utf-8中-无法识别,用utf8。

注意(),逗号,分号。

如下数(整小)日字,oracle两个不同:number包含整小,varchar2。

选用timestamp而不用datetime,因为datetime不会自动设置时间。

DDL后面不需要加from等词。

如下单引号可加可不加。

如下要写两个add。

如下3中第一排序字段相同的里面再进行第二排序。select(相当于System.out)第一个但在倒数第二执行。

如下查询id是1或3或5的学生。

d低下降,只要有数字都比null大。

如下有英语成绩有6个,不能代表总人数,缺考没算入。

select后的第一个字段要和group by后同。

如下是select语句执行顺序,红字书写顺序必须这样。

sql只有一种情况报错:语法写错。如下索引越界不会报错。

page和count是前端传来的两个参数,count不用变。

数量(count(*))降序只要一个(limit 1)。

如下将db3数据库整个连数据备份,本质create,insert。记住mysqldump和source。

多表是外键约束的前提,外键约束解决下面多表的2个问题,add...多了一条线。alter table emploee drop foreign key fk_001。

如上是在已有表添加外键,如下建表就添加(开发中常用)。

5.1 多表关系

中间表两外键:一对一(简历),一对多(员工,部门),多对多(学生,课表)。

5.2 多表查询

表...join表on。

sql 复制代码
CREATE DATABASE day03;
USE day03;
-- 创建部门表
CREATE TABLE dept (
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
-- 创建员工表
CREATE TABLE emp ( 
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(10),
  gender CHAR(1),   -- 性别
  salary DOUBLE,   -- 工资
  join_date DATE,  -- 入职日期
  dept_id INT
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);

如下要查出有用的记录需要emp.dept_id(emp外键)=dept.id(dept主键)。

因为select * ,所以将两个橙色横框拼接起来,棕色框。

如下注意记住左表不动。左外=左表+内连接。

如下第一个内连接没有销售部(销售部没有和员工表任何数据相交),第二个有销售部。

union all不去重,左外连接+右外连接。

5.3 事务

一组操作,要么同时成功,要么同时失败。

如下若在执行一次sql前执行一次start transaction,若不commit,刷新数据库不显示。

5.4 优化/备份/恢复

都是sql语句优化:

1. 数据库开启缓存,多次相同查询,结果放入缓存,不会从表中提取。

2.explain检查SQL查询(explain select...)。

3. where后面字段建立索引。

4. limit 1,查到一行就不继续往下走。

5. 大量insert或delete时会把表整个锁起来,导致大量web服务器请求过来进不去表,导致宕机,所以用limit进行拆分。

6. 数据类型尽量用小的,不同数据类型占用硬盘空间不一样,如果占用硬盘空间小且紧凑,这样硬盘数据读写快。

7. 固定字段长度,字段长度统一,数据库计算偏移量轻松。从前端查出来的数据会多出来一些空格,用trim去除空格再封装进对象。

8. 报错:该对象属性不为null或mysql查询数据为null...,用'空格'。数据库一字段查出赋值到java对象上,如果字段为null会报空指针异常。

9. 明确固定字段用enum(性别,市),enum速度比varchar快。

10. 不管任何方式查询表,最终都会通过主键定位到数据,建立主键会有效提高性能。id主键多用int速度比varchar快。

11. 避免使用rand(),order by rand()把数据库累死。

12. 两个字段类型一致,连接两表用join。

执行mysql安装目录下的bin/里面的这个mysqldump.exe工具。mysqldump是工具 -u是用户名 -p是密码 -A是全部的意思 -d是表结构 -t是表数据 > 是重定向的意思 > 右边是需要输出的路径和文件名。

全备份:mysqldump -uroot -p123456 -A > /back/backdb.sql

备份指定库命令:mysqldump -uroot -p123456 db1,db2 > /back/backdb.sql

备份指定表命令:mysqldump -uroot -p123456 db1 tb1 tb2, db2 tb2> /back/backdb.sql

备份表结构命令:mysqldump -uroot -p123456 -A -d > /back/backdb.sql

备份表数据命令:mysqldump -uroot -p123456 -A -t > /back/backdb.sql

恢复:source命令在执行时会显示详细信息,能看到执行到哪出错了:source /back/backdb.sql

float(8,6)小数点前面占2位,小数点后面占6位。

6.redis

6.1 安装

朋友圈数据缓存在手机内存,视频大量弹幕即海量数据先缓存再写入关系型数据库。如下两个存储文件第一次用是没有的。蓝横线是上一行的快捷方式,右击属性最后加上空格x.conf文件路径。Mysql默认3306端口,tomcat默认8080端口。

redis-cli.exe命令行客户端不好用,用图形化客户端redis-desktop-manager-0.7.6.15.exe:链接:https://pan.baidu.com/s/1iJZcnSbRsejUgTlfxu_EKQ 提取码:f8ym 。Add New Connection如下:

redis服务器软件关了, 没有reload就不会保存。redis安装后默认有16个仓库,默认使用db0,用select换数据库。

6.2 操作

如下list重索序,不需要知道集合长度,遍历只要0到-1索引。

如下理解score是分数可重复。

6.3 订阅

py 复制代码
# meta-hp/recipes-core/packagegroups/packagegroup-core-tools-debug.bbappend
MTRACE = ""
MTRACE:libc-glibc = ""
RDEPENDS:${PN} += " \
  python3-redis \
"
# 如下采用接口的subscribe(订阅/监听)和 publish(发布)方式要知道channel
import redis  # 如上安装才有,如下在bmc,240.1.1.1是cpu ip
redis_client = redis.Redis(host='240.1.1.1', port=6379, db=6)
pubsub = redis_client.pubsub() # pubsub是Publish-Subscribe(发布-订阅)的缩写
pubsub.subscribe("mychannel") # 订阅 即服务端 即接收打印
for message in pubsub.listen():
    print(message)

import redis   # 如下在cpu
redis_client = redis.Redis(host='127.0.0.1', port=6379, db=6)
redis_client.publish("mychannel","333")

如下在bmc中用命令直接get,可以获取key的value变化(插拔光模块有变化)。

如下进入redis后publish是channel,不是key(只是与key同名)。

如下没法订阅整个db(-n表示第几个Redis数据库)。

py 复制代码
# a.py , time ./a.py
import redis  # 不用redis库:cmd = f"redis-cli -h 240.1.1.1 -p 6379 -n 6 hget 'TRANSCEIVER_DOM_SENSOR|ethernet{i}' temperature"
def update_qsfp_temp():
    redis_pool = redis.ConnectionPool(host='240.1.1.1', port=6379, db=6)
    redis_client = redis.Redis(connection_pool=redis_pool)
    max_temp = -999000
    for i in range(1, 41):
        key = f"TRANSCEIVER_DOM_SENSOR|ethernet{i}"
        temp = redis_client.hget(key, "temperature")
        if temp is not None:
            temp = int(float(temp.decode()) * 1000)
            if temp > max_temp:
                max_temp = temp
    print(max_temp)
update_qsfp_temp()

7.ldap

如下类似8.1 mib文件。

如下-x:简单认证, -H:ldap服务器地址, -b:域名(类似表名),-D:dn,-w:-D里cn的密码。

7.1 添加人cn

在barbara.ldif中第二行添加changetype: add。

如下添加和修改密码:

-w:旧密码登录权限,-s:新密码。

7.2 添加组织ou

如下replace也支持add。

如下换组织:

8.snmp

8.1 mib文件

shell 复制代码
snmp的2个功能:https://github.com/net-snmp/net-snmp (编译安装参考net-snmp/INSTALL)
1.轮询polling: 服务端定期向客户端发送GET请求获取设备状态信息。
2.TRAP: 当客户端检测到特定事件或错误时向服务端发送TRAP消息。

#########################################################编译
# root权限
apt install libperl-dev
apt install libnl-3-dev libnl-route-3-dev
net-snmp/./configure  # 全选1
net-snmp/make
 fatal error: netlink/cache.h: No such file or directory
   29 | #include <netlink/cache.h>
# 看下文件是否存在
ls /usr/include/libnl3/netlink/cache.h
# 在net-snmp/agent/mibgroup/Makefile添加内容:
CFLAGS		+= -I/usr/include/libnl3/
# 注意查看文件:include\net-snmp\net-snmp-config.h,如果是undef,可手动修改:
#define HAVE_LIBNL3  1
# 如果前面编译仍然报错,可以无脑重新./configure再来一遍

#######################################################安装
# sudo make install
...
Libraries have been installed in:
   /usr/local/lib
creating directory /usr/local/include/net-snmp

#####################################################运行
net-snmp# snmpd
snmpd: error while loading shared libraries: libnetsnmpagent.so.50: cannot open shared object file: No such file or directory
net-snmp# ldconfig
/usr/local/bin# snmpconf
选snmpd.conf
选Access Control Setup
选SNMPv1/SNMPv2c read-write access community name
Finished Output: rwcommunity  public
Select section: finished
Other options: finished
Select section: finished
Other options: quit
Select File: quit
/usr/local/bin# cp snmpd.conf /usr/local/share/snmp/
/usr/local/bin# snmpd -c /usr/local/share/snmp/snmpd.conf
snmpwalk -v 2c -c public localhost system # 测试环境是否搭建好
shell 复制代码
# 客户端发送一段oid代码.1.3.6.4,对于服务端怎么解析?那只能在服务器端定义好mib定制规则的文件,客户端发其他的oid,服务器不识别就行了。
# /usr/local/share/snmp/mibs/AAA-MIB.txt 测试 :
AAA-MIB DEFINITIONS ::= BEGIN
IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
    enterprises,OBJECT-TYPE,TimeTicks, Counter32, snmpModules, mib-2
        FROM SNMPv2-SMI  ###################
    DisplayString, TestAndIncr, TimeStamp
        FROM SNMPv2-TC
    MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
        FROM SNMPv2-CONF;

	AAAModule MODULE-IDENTITY 
		LAST-UPDATED "202410192008Z"		
		ORGANIZATION 
			"none."
		CONTACT-INFO 
			"Contact-info. wit wow!!"
		DESCRIPTION 
			"Description."
		::= { enterprises 60000 }  ################

	aaaObj OBJECT IDENTIFIER::={AAAModule 1}  ###############
 
	aaaNode OBJECT-TYPE
		SYNTAX      DisplayString
		ACCESS      read-write
		STATUS      current
		DESCRIPTION "aaa node"
		::={aaaObj 1}  ################
END

# net-snmp/mibs/SNMPv2-SMI.txt:
org            OBJECT IDENTIFIER ::= { iso 3 }  --  "iso" = 1
dod            OBJECT IDENTIFIER ::= { org 6 }
internet       OBJECT IDENTIFIER ::= { dod 1 }
private        OBJECT IDENTIFIER ::= { internet 4 }
enterprises    OBJECT IDENTIFIER ::= { private 1 }

# snmptranslate -Tp -IR AAA-MIB::AAAModule
+--AAAModule(60000)
   |
   +--aaaObj(1)
      |
      +-- -RW- String    aaaNode(1)
               Textual Convention: DisplayString
               Size: 0..255

# snmptranslate -On AAA-MIB:aaaNode
.1.3.6.1.4.1.60000.1.1

8.2 实例

shell 复制代码
# Ubuntu服务端:
sudo apt update
sudo apt install snmp snmptrapd
vi /etc/snmp/snmptrapd.conf:authCommunity log,execute,net public
sudo systemctl stop snmptrapd.socket
# 启动:snmptrapd -f -Lo -c /etc/snmp/snmptrapd.conf udp:162
NET-SNMP version 5.10.pre1
2025-12-08 17:00:18 <UNKNOWN> [UDP: [172.18.251.36]:49621->[172.18.251.243]:162]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (45275055) 5 days, 5:45:50.55	SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.49871.1.0.0.1	SNMPv2-SMI::enterprises.49871.1.0.1.1 = Gauge32: 158	SNMPv2-SMI::enterprises.49871.1.0.1.2 = Opaque: UInt64: 18177222527854576019	SNMPv2-SMI::enterprises.49871.1.0.1.3 = INTEGER: 6	SNMPv2-SMI::enterprises.49871.1.0.1.4 = STRING: "SEL Entry from /xyz/openbmc_project/sensors/temperature/PSU1_AMB_Temp:  RecordType=2, GeneratorID=32, EventDir=1, EventData=504E4B(同下) EVENT_DIR=1 GENERATOR_ID=32 RECORD_TYPE=2 SENSOR_DATA=504E4B SENSOR_PATH=/xyz/openbmc_project/sensors/temperature/PSU1_AMB_Temp"


# bmc客户端:网页设置ip和端口
busctl call xyz.openbmc_project.Network.SNMP /xyz/openbmc_project/network/snmp/manager org.freedesktop.DBus.ObjectManager GetManagedObjects
a{oa{sa{sv}}} 1 "/xyz/openbmc_project/network/snmp/manager/1" 5 "org.freedesktop.DBus.Peer" 0 "org.freedesktop.DBus.Introspectable" 0 "org.freedesktop.DBus.Properties" 0 "xyz.openbmc_project.Object.Delete" 0 "xyz.openbmc_project.Network.Client" 3 "Address" s "172.18.251.243" "Port" q 162 "TransportProtocol" s "xyz.openbmc_project.Network.Client.TransportProtocol.UDP

tcpdump -i any udp port 162 -vvv -X
snmptrap -v 2c -c public 172.18.251.243:162 "" 1.3.6.1.4.1.12345.0 1.3.6.1.4.1.12345.1 s "test"

busctl call xyz.openbmc_project.Logging.IPMI /xyz/openbmc_project/Logging/IPMI xyz.openbmc_project.Logging.IPMI IpmiSelAdd ssaybq "SEL Entry" /xyz/openbmc_project/sensors/temperature/PSU1_AMB_Temp 3 0x50 0x4e 0x4b true 32

rm /run/log/journal/* -rf; systemctl restart systemd-journald  #清空日志
journalctl | grep phosphor-dbus-monitor/net-snmp/phosphor-snmp

ast2700编译器64位(ast2600是32位的不能用aarch64)net-snmp做如下修改:

相关推荐
原创小甜甜4 小时前
将target目录添加到了git,将其移除操作
git
AugustRed4 小时前
多远程仓库 Git 完整命令手册
git
霸道流氓气质5 小时前
Git 共享分支安全撤销提交与 Gerrit Change-Id 问题处理指南
git·安全
悟空瞎说9 小时前
Git 协作工作流详解:从个人单打独斗到规模化团队协同
前端·git
染翰9 小时前
Java 实现 Git 自动克隆工具,打包成 Windows 独立 EXE(免安装JDK)
java·git·后端
雪的季节11 小时前
团队 Git 协作完整教程(企业级标准流程)
git
czhc114007566312 小时前
6.4:git
git
Rain50912 小时前
实战:搭建 AI Code Review 自动化流水线
前端·人工智能·git·ci/cd·自动化·ai编程·代码复审
zzzzzz31012 小时前
GitHub 今日爆火!headroom:一个帮你省 60-95% Token 的 AI Agent 上下文压缩神器
git·机器学习·github