线上回滚日记 TEST

不断书写才可以成长


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

线上回滚笔记-02

发表于 2018-06-07 | 阅读次数:
字数统计: | 阅读时长 ≈

DSN(Data source name) 初探

​ 最近的服务需要到MySql中进行增删查改,数据库一直是自己的弱项,碰巧这个机会,好好补补这方面的知识点。第一步,链接数据库的地址,ip地址、端口、账号、密码和数据库名都给你了,怎么去组织这些字段,当然google都会有答案,更好的方式是彻底的理解。

​ 维基百科(https://en.wikipedia.org/wiki/Data_source_name),给出的答案是:In computing, a data source name is a string that has an associated data structure used to describe a connection to a data source. 并且主要用于开放数据库的连接和Java数据库的连接。从用途和语言的角度,DSN的形式千变万化,但是主要作用都是对数据源进行连接,数据源可以是文件、数据库、系统和用户等。也可以在任意的语言形式中使用。

The Data Source Name has a common format, like e.g. PEAR DB uses it, but without type-prefix (optional parts marked by squared brackets):

1
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

A DSN in its fullest form:

1
username:password@protocol(address)/dbname?param=value

Except for the databasename, all values are optional.

常用实例:

1
2
3
4
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

Ref: https://github.com/go-sql-driver/mysql

使用MySQL数据库

go中使用mysql的基本方式, 包括增删查改。使用模式基本为:

  1. stmt, err := db.Prepare() 建立基本连接
  2. res, err := stmt.Exec() 执行基本操作,输入参数填入第一步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
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
package main

import (
"database/sql"
"fmt"
//"time"

_ "github.com/go-sql-driver/mysql"
)

func main() {
db, err := sql.Open("mysql", "astaxie:astaxie@/test?charset=utf8")
checkErr(err)

//插入数据
stmt, err := db.Prepare("INSERT userinfo SET username=?,department=?,created=?")
checkErr(err)

res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
checkErr(err)

id, err := res.LastInsertId()
checkErr(err)

fmt.Println(id)
//更新数据
stmt, err = db.Prepare("update userinfo set username=? where uid=?")
checkErr(err)

res, err = stmt.Exec("astaxieupdate", id)
checkErr(err)

affect, err := res.RowsAffected()
checkErr(err)

fmt.Println(affect)

//查询数据
rows, err := db.Query("SELECT * FROM userinfo")
checkErr(err)

for rows.Next() {
var uid int
var username string
var department string
var created string
err = rows.Scan(&uid, &username, &department, &created)
checkErr(err)
fmt.Println(uid)
fmt.Println(username)
fmt.Println(department)
fmt.Println(created)
}

//删除数据
stmt, err = db.Prepare("delete from userinfo where uid=?")
checkErr(err)

res, err = stmt.Exec(id)
checkErr(err)

affect, err = res.RowsAffected()
checkErr(err)

fmt.Println(affect)

db.Close()

}

func checkErr(err error) {
if err != nil {
panic(err)
}
}

线上回滚笔记-01

发表于 2018-06-07 | 阅读次数:
字数统计: | 阅读时长 ≈

Linux 常用shell 指令

​ 线上回滚笔记的第一篇,记一下这些天碰到和学到的Linux指令。入职以来,碰到很多开发环境和系统工具的学习和适应的过程,在越来越讲究效率的工程团队,Linux指令的熟悉层度可以很大的提高效率。无论在包下发,还是在线上环境测试,Shell指令,都可以很大的提升效率。

​ shell是Linux环境下批处理的脚本语言。其按一定的语法进行系统调用,对于批处理的任务可以任意的脚本话,使得一些很简单的批处理任务可以脚本化完成。

​ 为什么需要用shell去处理任务呢,在很多现实场景中,我们的简单的处理任务都是串行化并且简单化的。系统提供的命令可以快速的检索日志、查看网络通信接口,查看系统和硬件的状况。

​ 怎么用?

  • 线上服务更新Shell指令

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
source /etc/profile
svr=`ps aux |grep 'sso_proxy' |grep -v grep | awk '{print $2}' |wc -l`
if [ $svr -eq 0 ];then
source /etc/profile
/usr/local/services/TSF3-PHP7-1.0/runtime/php/bin/php /data/web_deployment/svr/tsf2/sso_proxy_tcp/Start.php &
else
ps aux |grep 'sso_proxy_tcp-master' |grep -v grep | awk '{print $2}' | xargs kill -15
sleep 1
/usr/local/services/TSF3-PHP7-1.0/runtime/php/bin/php /data/web_deployment/svr/tsf2/sso_proxy_tcp/Start.php &
fi
  1. ps–Process Status(查看进程状态指令)

    • ps aux 是常用指令兼容的效果比较高,使用BSD syntax显示所有进程的状态
      • ax一起使用是列出所有的状态
      • u 做格式命令出现,表示输出采用面上用户的格式
      • 兼容性比较好 在mac上一样的输出
  2. grep–Global Regular Expression Print (全局正则表达式指令) 并把匹配的行打印出来

    1
    grep [option] pattren file
    • -v == –revert-match 显示不包含匹配文本的所有行

    • 正则

      • 元字符 “ \b”, “.”, “*”, “\d”
        1. \bhi\b.*\bLucy\b 匹配hi单词 后不远有单词Lucy
        2. 0\d{2}-\d{8} 匹配0后面2个数字 + 连字符 + 后面8位数字
      • 常用的元字符 “^ 字符串的开始”、”$ 字符串的结束”、”\w 匹配数字或字母或下划线”、”\s 匹配任意空白符”、”. 匹配除换行符的任意字符”、
        1. ^\d{5,8}$ 匹配5到8位长度的字符串
      • 字符转义 – www\.\.com = www..com
      • 重复 – * 重复0次或多次| + 重复1次或多次| ? 重复0次或1次|{n}重复那次| {n,} 重复n次或者更多 |{n,m}重读n次到m次
        1. Window\d+
        2. ^\w+
      • 字符集 – 建立自己的查找字符集进行匹配 [aeiou] 匹配一个元音字符 [.?!]匹配三个符号的任意一个 [0-9]等同于\d,[a-z0-9A-Z_]等同于\w
        1. (?0\d{2}[) -]?\d{8}
      • 分支条件–用|把不同的规则分隔开
        1. 0\d{2}-\d{8}|0\d{3}-\d{7}
        2. \(0\d{2}\)[-]?\d(8)|0\d{2}[-]?\d{8}
      • 分组规则–重复多个字符,用小括号指定子表达式,然后指定子表达式的重复次数
        1. (\d{1,3}\.){3}\d{1,3} ip地址的匹配格式,但存在不可能的IP地址
        2. ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}
      • 反义– 查找不属于某个简单定义的字符类的字符 [\^x] 匹配除了x以外的任意字符[\^aeiou]匹配除了aeiou几个字符外的字符
        1. \S+ 匹配不包含空白符的字符串
        2. <a/[/^-]+>
      • 后向引用 – 匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理,后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。
      • 零宽断言 – 用于指定一个位置,这个位置应该满足一定的条件
        1. \b\w+(?=ing\b) 用于匹配以ing结尾的ing前面的一部分
          . (?<=\bre)\w+\b 用于匹配re开头的单词的后一部分
    • -h 只显示抓出来的行的内容,不显示文件名

    • -e 指定pattern

    • -l 只显示抓到指定模式内容的文件名

    • -n 显示抓到的文件的行数

  3. tcpdump — 抓包, 抓取网络中的通信包

    1. tcp ucp 指定抓包的类型
    2. host port 指定抓包的host或者端口号port
    3. -X 指定打印包的格式 详细的包内容
    4. -i 指定网卡
  4. kill – 对进程发送信号

    1
    2
    3
    4
    5
    6
    7
    8
    kill -s signal_name pid #向对应进程发送对应的信号
    1 HUP (hang up)
    2 INT (interrupt)
    3 QUIT(quit)
    6 ABRT(abort)
    9 KILL(non-catchable)
    14 ALRM(alarm clock)
    15 TERM(software termination signal)
    1. 批量关闭含有某些关键词的进程

      kill -9 $(pidof 进程名关键字)

    ​

123
Mark Zhan Zha

Mark Zhan Zha

回滚即使成长, 更高的要求是对极致和细节的追求

22 日志
27 标签
GitHub E-Mail
© 2018 Mark Zhan Zha | Site words total count:
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4