2018年7月

基础的路由追踪软件:traceroute

CentOS系统:

yum update && yum install traceroute -y

Debian/Ubuntu系统:

apt-get update && apt-get install traceroute -y

通过 traceroute x.x.x.x 来路由追踪了
默认是测试3次的,所以有时候会显示很乱,你可以加上 -q 1 ,比如 traceroute -q 1 x.x.x.x

Nali-ipip
这个是基于 nali 原版项目上改进的,把纯真IP库改为了IPIP的IP库

CentOS系统:

yum update && yum install -y traceroute git gcc make

Debian/Ubuntu系统:

apt-get update && apt-get install -y traceroute git gcc build-essential make
下载文件并编译安装:

git clone https://github.com/dzxx36gyy/nali-ipip.git
cd nali-ipip

进入目录并 执行编译程序,放心很快 几秒就好了。

./configure && make && make install
通过 nali-traceroute x.x.x.x 来路由追踪。
默认是测试3次的,所以有时候会显示很乱,你可以加上 -q 1 ,比如 nali-traceroute -q 1 x.x.x.x

数据库语句(操作)

show databases;

  • 查询当前所有数据库

show create database 库名;

  • 查看当前数据库的创建方式,查看数据库的编码表

create database 库名;

  • 创建一个数据库,使用默认编码表

create database 库名 character set 编码表名;

  • 创建一个数据库,并指定编码表

drop database 数据库名;

  • 删除数据库

alter database 数据库名称 character set 字符集(编码表);

  • 修改数据库编码表

use 数据库名;

  • 切换数据库

select database();

  • 查询当前正在使用的数据库

数据表语句(操作)

create table 表名(

​ 列名 类型(长度),

​ 列名 类型(长度),

​ 列名 类型(长度)

);

  • 创建一个数据表
  1. 创建表的时候,一定要先切换到某一个具体的数据库,因为只有某一个具体的库下才会有数据库表。
  2. 一个数据表可以存在很多列,每列具有类型和长度。
  3. 多个列之间使用逗号隔开,最后一个列不需要输入逗号。

数据类型

  • 字符类型

    • varchar(长度)

    列的长度可变会自动适应长短

    • char(长度)

    列的长度固定,不可变,不够用空格补足

  • 大型数据类型

    • blob-字节

    存放二进制内容(字节数据)视屏,音频,图片

    • text

    保存字符数据,存放大文本,存放可超过255个字符

    通常我们不会把文件存储到数据库。(占用资源,操作速度慢)我们会把文件的路径(通常存放在本地磁盘)存到数据库中。

  • 数值型

    • 整型:tinyint,smallint,int,bigint
    • 小数:float,double
  • 位数据类型(布尔)

    • bit:1表示true,2表示false
  • 日期型

    • date:只有日期年月日
    • time:只有时间时分秒
    • datetime:日期和时间都包含年月日时分秒
    • timestamp:日期和时间都包含 ------->当表中其他数据被修改的时候,那么此时时间就会自动更改为更改数据时的时间

show tables;

  • 查看当前数据库的所有表

desc 表名;

  • 查看表中的列信息(desc是describe的缩写)

单表创建时的约束

限制列数据的样子

约束语法

列名 数据类型 约束条件

  • 主键约束:primary key(非空,唯一)

    • 主键一般表示数据库中的某一列,使用这一列来区分数据表中的数据和其他数据不同。这一列的数据在整个数据表中是不允许重复的,并且不为空。
      注意:只要某一列被声明为主键,那么这个列就不能重复,并且不能为空。
    • 主键的定义格式:

    列名 列的类型 primary key

    • 补充:自增长 auto_increment

    如果表的主键是int类型,这时可以在主键的后面添加auto_increment ,这时表中这一列在添加数据的时候,会自动的增长。

  • 唯一约束:unique(值唯一,表中可以有多个唯一约束,可为null不算重复)

定义格式:列名 列的类型 unique

  • 非空约束:not null (表示该列的内容不允许为空,该字段的值不能为空)

数据表结构修改

修改数据表:

可以对表名、表中的列名、列的类型等进行增删改。

  1. 增加列
  • 语法:alter table 表名 add 列名 类型(长度) 约束;
  1. 修改现有列类型、长度和约束
  • 语法:alter table 表名 modify 列名 类型(长度) 约束;
  1. 修改现有列名称
  • 语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
  1. 删除现有列
  • 语法:alter table 表名 drop 列名 ;
  1. 修改表名
  • 语法: rename table 旧表名 to 新表名;
  1. 修改表的字符集
  • 语法:alter table 表名 character set 编码集;

删除数据表

drop table 表名;

数据表内容的增删改

向数据表插入数据

值要用''单引号包起来

  • 语法:insert into表名 (列名1,列名2,列名3......)  values (值1,值2,值3......);
  • 语法:insert into 表名 values (值1,值2,值3......);
    • 值与列一一对应。有多少个列,就需要写多少个值。如果某一个列没有值。可以使用null。表示插入空。
    • 值的数据类型,与列被定义的数据类型要相匹配。并且值的长度,不能够超过定义的列的长度。
    • 字符串:插入字符类型的数据,建议写英文单引号括起来。在Mysql中,使用单引号表示字符串
    • date 时间类型的数据也得使用英文单引号括起来: 如’yyyy-MM-dd’,’yyyy/MM/dd’,’yyyyMMdd’ 。
    • 如果主键是自动增长的,可以直接插入数值null。
    • 省略部分列

      • 可以省略部分列名。某一列有默认值,或者允许为空,才可以省略。主键是自增长的认为是有默认值的。也可以省略
      • 注意:在插入数据的时候,如果某些列可以为null,或者是自动增长的列,或者有默认值的,在插入的时候可以省略。
    • 省略所有的列
    • insert into 表名 values(值,值,值,值);
    1. 表中有多少列,就有多个值。
    2. 按照表的结构,列和值去对应。 desc 表名 得到列的顺序。 从上倒下,对应的值,从左到右插入数据。

      • 注意:如果给表中的所有列插入数据,这时可以省略表名后面的列名,直接写values

    数据记录修改操作

    • 语法: update 表名 set 列名=值,列名=值.... [ where条件语句 ];
    • 注意事项:

      1、如果不加条件语句,将会修改某一列的所有值。

      2、一般修改数据时,都需要增加条件。(重点)

    删除表中数据

    delete语句

    • 语法:delete from 表名 [where条件语句];
    • 注意:

      • 如果删除表中的记录时,没有添加where条件,这时会把表中的所有数据删除。表依然存在,是空的表。
      • delete是删除行的数据。

    truncate语句

    • 语法:truncate table 表名;
    • 先删除表,再创建表,就等于将数据全部删除了。也就是说上述语句执行时会把表的所有内容都删除掉,然后在创建一个新的表。

    性能问题: truncate table的性能相对来说更好,尤其删除的数据越多,越明显。

    如果要删除一张表中的所有数据,也可以使用 truncate table 表名;

    执行时会把表的所有内容都删除掉,然后在创建一个新的表。

    truncate缺点:不能有条件的删除。

    delete 是逐行删除,并没有恢复初始化值。

    1.DELETE
     ・DML语言

    ・数据还可以找回来,恢复回来
     ・可以有条件的删除。DELETE FROM 表名 WHERE 条件
    2.TRUNCATE TABLE
     ・DDL语言

    ・数据不可以恢复
     ・先将整个表删除,再重新创建

     ・删除速度比delete快。

    数据表记录的查询

    查询数据库中的某张表的所有数据

    • 语法:select * from 表名;
    • 表示查询表的所有信息。会把表的所有的列,所有的行都列出来。

      1)select 表示选择的意思;

      2)* 表示所有的数据;

      3)from 表示从哪个表中选择;

    查询某张表中指定的列

    • 语法: select 列名,列名... from 表名;
    • 说明:显示指定列数据。列出所有行信息。

    按条件查询

    • 语法:select 列名,列名..... from 表名 where 条件;
    • 说明:查找符合where条件的数据。
    • 作用:过滤,只有符合条件的,才去列出相应的信息。

    运算符

    1. 比较运算符

    >(大于)  <(小于)  >=(大于等于)  <=(小于等于)  =(相等)  <>或者!= (不相等)

    1. 逻辑运算符

    and 逻辑与 ,多个条件同时成立。

    or 逻辑或 ,多个条件任意一个成立。

    not 逻辑非

    1. 区间:between ... and ... 在两者之间取值。

    格式:列名 between 开始值 and 结束值;

    注意:前面那个数即开始值要比后面那个数即结束值要小

    1. in(值1,值2,值3) 在指定值中任意取。

    举例: in(70,80,90) 值可以是70、80或者90

    使用格式:where 列名 in (值,值,值.......);

    等价于

    where 列名=值 or 列名=值 or 列名=值 .......

    1. 模糊查询:like '模糊查询部分'

      表达式有两个占位符:
      

    A: % 表示零或任意多个字符 ;

    B: _ 任意单个字符;

    例如:

    ​ name like '张%' 所有姓张学员。

    ​ name like '%张%' 只要有张就可以。

    ​ name like '张_' 所有姓张名字为两个字学员。

    ​ name like '_张_' 只有中间是张,前面一个字,后面一个字。

    1. is null 判断该列值是否为空。

    sql中对null的判断,不能写 = null 在sql 中 null = null 结果不成立。 正确格式:is null

    不是空 : is not null。

    过滤重复数据

    查询排重:select distinct 列名 from 表名 [where 条件];

    说明:distinct: 去重复。显示distinct后面列的内容,并且过滤掉重复的数据。

    对查询结果进行排序

    使用order by 子句排序查询结果。

    • 语法:select * from表名 order by列名1 asc|desc,列名2(asc|desc),列名3(asc|desc)。。。。。;
      按照第一列进行排序,如果第一列相同,按照第二列在进行排序,以此类推。
      asc是升序排列,desc是降序排列。默认是asc升序。

    别名

    • 语法:select 列名 as 别名,列名 as 别名,列名 as 别名.... from 表名 where 条件;

    注意:在使用别名的时候as关键字可以省略。

    聚合函数

    语法:select count(*)或者count(具体列名) from 表名;

    • 统计记录数(统计行数)
    • 注意: count(具体列名):在根据指定的列统计的时候,如果这一列中有null的行,该行 不会被统计在其中。按照列去统计有多少行数据。
      select count(列名) from 表名:按具体列来进行统计行数。

    select count(*) from 表名: 统计表中的行数。

    语法:select sum(列名) ,sum(列名) ,......from 表名;

    • 求和
    • 注意:如果使用sum 多列进行求和的时候,如果某一列中含有null,这一列所在的行中的其他数据不会被加到总和中。
    • 在mysql中null值和任何值相加为null

    ifnull(列名, 默认值)

    • 表示判断该列名是否为null,如果为null,返回默认值,如果不为null,返回实际的值

    truncate(列名, 截取的小数位)

    • 表示截取的意思,保留几位小数。

    语法: select avg(列名) from 表名;

    • 求平均值
    • 注意:求某列的平均值,avg里面的null不作为统计。

    select max(列名)\min(列名) from 表名;

    • 统计该列的最大值或者最小值,null排除在外。

    完整写法:
    select … from … group by 列名,列名;

    • group by分组函数
    • 官方定义:
      分组: 按照某一列或者某几列。把相同的数据,进行合并输出。
    • 注意:

    聚合函数:分组之后进行计算;

    通常 select后面的内容是被分组的列,以及聚合函数;

    在sql语句中的where 后面不允许添加聚合函数,添加就会报上述错误。可以使用having条件,表示分组之后的条件,在having后面可以书写聚合函数。
    关于 having 的用法解释:
    having和group by 一起使用,having和where的用法一模一样,where怎么使用having就怎么使用,where不能使用的,having也可以使用,比如说where后面不可以使用聚合函数,但是在having后面是可以使用聚合函数的。

    having是从筛选出来的字段再筛选,而where是从数据表中的字段直接进行的筛选

    Sql语法顺序

    S(select)… F(from)…W(where)…G(group by)…H(having)…O(order by);

    mysql数据库备份与恢复

    备份

    语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径

    由于mysqldump命令不是sql命令,需要在dos窗口下使用。

    恢复

    语法:mysql -u 用户名 -p 导入库名 < 硬盘SQL文件绝对路径

    需要在dos窗口下使用

    多表设计

    多对多

    外键约束介绍

    使用中间表的目的是维护两表多对多的关系:

    1 中间表插入的数据必须在多对多的主表中存在。

    2 如果主表的记录在中间表维护了关系,就不能随意删除。如果可以删除,中间表就找不到对应的数据了,这样就没有意义了。

    添加外键约束方法

    语法:foreign key( 当前表中的列名 )  references 被引用表名(被引用表的列名);

    给已经存在的表添加外键约束

    alter table 中间表名 add foreign key(中间表中的列名) references 被引用表名(被引用表的列名);

    创建表时就添加外键约束

    create table 中间表名(

    ​ 列名 类型(长度),

    ​ 列名 类型(长度),

    ​ foreign key( 当前表中的列名 )  references 被引用表名(被引用表的列名),

    ​ foreign key( 当前表中的列名 )  references 被引用表名(被引用表的列名)

    );

    添加外键需要注意的问题:

    • 如果从表(引入字段的表,coder_project)要去添加一个外键约束。要求主表(被引用字段的那个表,coder或者project)被引用的字段是主键或者唯一的。通常使用主键。
    • 如果要删除主表中的数据。要求在从表中这个数据,要没有被引用,才可以去删除。
    • 如果要向从表中去添加数据。要求在主表中,要有对应的数据。才可以去添加。
    • 如果要删除表。要先删除从表。然后去删除主表。
    • 新建表的时候。需要先去创建主表,然后去创建从表。
    • 外键约束作用:保持数据的完整性,和有效性。

    多表查询

    内连接查询

    隐式内连接查询

    语法:select 列名 , 列名from 表名1,表名2 where 表名1.列名 = 表名2.列名;

    显式内连接查询

    语法:select * from 表名1 inner join 表名2 on 条件

    • 查询两表的交集

    外连接查询

    左外连接

    语法:select * from 表1 left outer join 表2 on 条件;

    • 用左边表去右边表中查询对应记录,不管是否找到,都将显示左边表中全部记录。

    语法:select * from 表1 right outer join 表2 on 条件;

    • 用右边表去左边表查询对应记录,不管是否找到,右边表全部记录都将显示。

    全外连接

    语法:select * from 表1 full outer join 表2 on 条件

    • 左外连接和右外连接的结果合并但是mysql数据库不支持此语法。Oracle和DB2及其他数据库是支持的。我们可以使用union来达到全外连接的查询效果。
    • union :可以将左外连接查询和右外连接查询两条sql语句使用union合并起来进行查询,去掉重复的数据。(union all可不去重)

    关联子查询

    • in的用法

      • in 表示条件应该是在多个列值中。
      • in:使用在where后面,经常表示是一个列表中的数据,只要被查询的数据在这个列表中存在即可。
    • exists的用法

      • 语法:select * from 表名 where exists (select … from 表名 where 条件) ;
      • 将外表中的查询结果拿到内表中去逐行判断条件是否成立,如果成立,取出该行结果。
      • exists的意思是表示存在,如果子查询有返回数据行,就认为是true,否则就认为是false,关注的是子查询是否有数据。只要有数据就认为匹配成功
    • all的用法

      • 表示所有,和union一起使用不去重。
      •  a>all(1,2,3)   等价于 a>1 and  a>2 and  a>3   等价于 a>3   等价于 a>max(1,2,3)
    • any的用法

      • 表示任何一个
      • a > any(1,2,3) 等价于 a>1 或者 a>2 或者 a>3 等价于 a>1 等价于 a > min(1,2,3)
      • some: 表示任何一个,和any的作用相同。
        any和some是没有区别的,some和any 效果一样 ,代表一部分记录
    • as的用法

      • 不仅可以用来做列的别名,还可以将查询结果通过as作为一张表来使用。
    • limit的用法

      • 语法:select * from 表名 limit offset, row_count;
      • offset 表示索引从哪里开始,注意这里的索引从0开始。
        row_count表示要查询几个。
      • 限制查询结果返回的数量,返回前几条或者中间某几行数据。

    JDBCTemplate

    构造方法
    public JdbcTemplate(DataSource dataSource)
    dataSource参数:传递数据源做为参数

    方法

    查询一条数据存放至map

    Map<String,Object> queryForMap(String sql,Object...args)

    sql参数:sql语句
    args参数:可变参数,用来接收sql语句中?的值

    查询一条记录封装成bean(自己写实现类)

    <T> T queryForObject(String sql,RowMapper<T> romMapper,Object... args)

    • Interface RowMapper<T>接口

      • T mapRow(ResultSet rs,int rowNum)将结果集映射成一个实体JavaBean对象
        rs参数:结果集

      rowNum参数:表示结果集里有多少条记录

    查询一条数据封装成Bean类(使用BeanPropertyRowMapper实现类)

    <T> T queryForObject(String sql,RowMapper<T> romMapper,Object... args)

    • BeanPropertyRowMapper类

      • 构造方法
      • BeanPropertyRowMapper(Class<T> mappedClass)
      • mappedClass参数:bean类字节码对象,底层运用反射将数据封装到当前bean类中

    查询多条记录封装Bean

    <T> List<T> query(String sql,RowMapper<T> rowMapper)

    可用BeanPropertyRowMapper类

    查询所有数据封装成Map

    List<Map<String , Object>> queryForList(String sql)

    查询一列数据

    <T> List<T> queryForList(String sql,Class<T> elementType)

    elementType参数:要查询的数据类型的字节码对象

    查询用聚合函数

    <T> T queryForObject(String sql , Class<T> requiredType)

    requiredType参数:返回值类型的字节码对象

    • 安装引导界面 按Shift+F10打开命令提示符

      • 输入Diskpart进入磁盘工具
      • 输入list disk查看磁盘信息
      • 输入select disk 0进行选择磁盘操作
      • 输入Clean执行清空当前磁盘分区
      • 输入convert mbr(gpt)转换mbr以及gpt分区

    convert basic -将磁盘从动态转换为基本。
    convert dynamic -将磁盘从基本转换为动态。

    需要root权限

    安装

    # 安装supervisor
    apt-get install supervisor
    # 初始化
    echo_supervisord_conf > /etc/supervisord.conf
    # 初始化配置文件
    # 此命令会在 /etc/下创建一个示例配置文件

    确定启动命令

    # 原版shadowsocks启动命令
    ssserver -c /home/gzm/config2.json
    # shadowsocks-libev启动命令
    ss-server -c /home/gzm/config2.json
    # udp连接
    ss-server -c /etc/shadowsocks-libev/config.json -u

    脚本安装后的命令

    # 启动:
    /etc/init.d/shadowsocks start
    # 停止:
    /etc/init.d/shadowsocks stop
    # 重启:
    /etc/init.d/shadowsocks restart
    # 查看状态:
    /etc/init.d/shadowsocks status

    配置
    在/etc/supervisord.conf文件最后添加shadowsocks实例,代码如下
    这一段配置如果配置错误,会导致supervisor的启动失败

    [program:shadowsocks]
    command = ss-server -c /etc/config.json -u
    user = root
    autostart = true
    autoresart = true
    #stderr_logfile = /var/log/supervisor/ss.stderr.log
    #stdout_logfile = /var/log/supervisor/ss.stdout.log
    #command就是ss的运行命令;
    #user是执行命令的用户;
    #autostart和autoresart指自动启动和自动重启;
    #stdout_logfile重定向程序输出到此文件;
    #stderr_logfile重定向程序错误到此文件;

    运行supervisor

    # 运行的时候使用-c指定配置文件
    supervisord -c /etc/supervisord.conf
    # 如果不指定配置文件
    supervisord
    
    # 那么配置文件会依次再下面的文件夹中寻找
    # $CWD/supervisord.conf
    # $CWD/etc/supervisord.conf
    # /etc/supervisord.conf

    更新配置文件
    当我们修改配置后,为了使新的配置生效,我们需要通知supervisor是新配置文件生效,我们使用下面的命令:

    # 使新的配置文件生效
    supervisorctl update

    其他命令

    当supervisor运行后,管理他就不能用supervisord了,而是supervisorctl。下面是一些常用的运行命令

    # 控制所有进程
    supervisorctl start all
    supervisorctl stop all
    supervisorctl restart all
    # 控制目标进程
    supervisorctl stop shadowsocks
    supervisorctl start shadowsocks
    supervisorctl restart shadowsocks

    开机自启动

    vi /etc/rc.local
    # 在exit前添加以下内容
    supervisord -c /etc/supervisord.conf

    web服务管理

    如此配置后我们就可以在浏览器中输入127.0.0.1:9001来管理supervisor托管的任务。

    如果将回环地址127.0.0.1换为服务器的IP地址,就可以可以远程管理supervisor了。

    # 在配置文件后加上服务器配置信息
    [inet_http_server]
    port = 182.161.34.85:9001
    username = user
    password = ly1995
    
    # 最后不要忘了reload使之生效!
    supervisorctl reload

    Shadowsocks-libev使用AEAD加密时,系统开启后首次运行Shadowsocks-libev可能会出现如下字样的提示:

    This system doesn't provide enough entropy to quickly generate high-quality random numbers
    Installing the rng-utils/rng-tools or haveged packages may help.
    On virtualized Linux environments, also consider using virtio-rng.
    The service will not start until enough entropy has been collected.

    原因也正如提示中所说,系统没有足够的熵,这时候可以通过安装rng-tools来解决这个问题
    如果不安装rng-tools,等待一定的时间后,服务也可以正常运行,至于用还是不用,请自行取舍

    安装rng-tools:

    apt-get update
    apt-get install rng-tools

    编辑配置文件:

    vi /etc/default/rng-tools

    添加如下内容:

    HRNGDEVICE=/dev/urandom

    安装完成,rng-tools会在重新启动服务器后生效
    重启服务器后,Shadowsocks-libev对应的提示便会消失,Shadowsocks-libev服务也会在系统启动后立即启动,不会再浪费时间去等待系统收集熵