最近文章

CentOS 7 安装Redis

redis安装都是通过源码编译安装。这里基于redis5安装redis在CentOS 上安装redis分三个步骤:下载,解压,编译$ wget http://download.redis.io/releases/redis-5.0.7.tar.gz $ tar xzf redis-5.0.7.tar.gz $ cd redis-5.0.7 $ make注意:这里需要在CentOS上预先安装好gcc
标签:

MySQL 5.7设置用户密码过期

数据库mysql的user表里有三个字段用于控制用户密码过期的设置:`password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `password_last_changed` timestamp NULL&nbs
标签:

curl post请求发送json数据两种方式(Window/Linux)

设置请求头Content-Typecurl发送post请求,默认的content-type是:application/x-www-form-urlencoded。要发送json格式,则需要设置请求头的content-type为application/json。使用-H 或--header参数设置content type:-H "Content-Type: application/json"发送数据
标签:

MySQL 5.7 忘记root密码,使用--skip-grant-tables重置root密码的通用方法

这里主要介绍在不知MySQL的root密码的情况下,使用--skip-grant-tables关闭MySQL服务器的认证,从而可以重置root的密码。MySQL版本为5.7。1、关闭MySQLsudo service mysqld stop2、使用--skip-grant-tables 和 --skip-networking 重启MySQ
标签:

Linux自定义$PATH环境变量

$PATH变量内容使用echo命令查看$PATH变量的值:$ echo $PATH /home/xx/bin:/home/xx/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/java/jdk/bin:/usr/jav
标签:

MySQL开启general_log查看执行的SQL语句

general log会记录下发送给MySQL服务器的所有SQL记录,因为SQL的量大,默认是不开启的。一些特殊情况(如排除故障)可能需要临时开启一下。开启MySQL的general logMySQL有三个参数用于设置general log:general_log:用于开启general log。ON表示开启,OFF表示关闭。log_output:日志输出的
标签:

MySQL安装系列:使用通用二进制文件在Unix/Linux安装

下载页面下载最新版本下载页面:https://dev.mysql.com/downloads/操作系统选择:Linux - Genericwget下载wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-i686.tar.gz 下载后的包为tar.gz。环境准备卸
标签:

MySQL定时任务event

MySQL的Event可以用来设置定时任务。MySQL配置开启Event定时任务功能MySQL默认是关闭定时任务这个功能,在我们开始设置定时任务前,先检查下MySQL是否已经开启此选择show variables like '%event_scheduler%';如果为Off,两种方式可以对它进行修改​ 1. set语句(当前启动的实例有效,重启后无效)set global event_sched
标签:

获取curl的http response状态码

可以使用以下脚本获取curl请求返回的状态码:curl -w '%{response_code}\n' -so /dev/null $URL其中$URL是一个变量,可以使用实际测试的url替换。如请求百度:curl -w '%{response_code}\n' -so /dev/null https://baidu.com输出结果:302
标签:

shell脚本变量的使用

问var=value 在export前后的差在哪? 这次让我们暂时丢开command line,先了解一下bash变量(variable)吧…所谓的变量,就是利用一个固定的”名称”(name),来存取一段可以变化的”值”(value)。1. 变量设定(set)在bash中, 你可以用”=”来设定或者重新定义变量的内容: name=value 在设定变量的时候,得遵守如
标签:

MySQL使用LAST_DATE获取日期所在月份的最后一天

MySQL提供了LAST_DATE函数用来获取日期所在月份的最后一天:LAST_DATE(date_col)示例:mysql> SELECT LAST_DATE(NOW()); 2018-01-31
标签:

清空docker所有数据shell脚本

1、停掉所有的容器docker stop `docker ps -qa`2、删除dockers所有容器docker rm `docker ps -qa`3、删除所有镜像docker rmi -f `docker images -qa `4、删除所有volumedocker volume rm $(docker volume ls -qf)删除所有网络设置docker network rm `doc
标签:

CentOS 7配置安装多个redis实例

1、给新redis实例创建redis配置(复制redis.conf)$ cp /etc/redis.conf /etc/redis-xxx.conf2、修改复制的redis-xxx.conf...#修改pidfile#pidfile /var/run/redis/redis.pidpidfile /var/run/redis/redis-xxx.pid...#dir /var/lib/redis/
标签:

Docker MySQL备份和恢复数据库命令

这两个命令用于对正在运行的Docker MySQL容器做备份和恢复备份Docker MySQLdocker exec CONTAINER /usr/bin/mysqldump -u username --password=xxx DATABASE > backup.sql 从sql文
标签:

MySQL类型隐式转换规则

在MySQL语句里,如果操作符应用于不同的类型的操作数,为了兼容让操作数兼容,MySQL会对操作数做类型转换,有些是自动的隐式转换。“+”号操作符使用“+”号相加的是字符串或字符串和数字,字符串会隐式转换为数字。以数字开头的字符串以数字开头的字符串,它会截取前面的数字字符串,转换为对应的数字。mysql> select '1a' + 1; +-----
标签:

MySQL 5.7账号锁定Account Lock

MySQL 5.7.8新增了Account Lock用于锁定账号。Account Lock可以在创建账号锁定,也可以使用ALTER USER语句进行锁定。创建账号时锁定mysql> CREATE USER 'demo'@'localhost' IDENTIFIED BY 'a123456'&n
标签:

MySQL5.7安装报错:GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql"

根据官方文档使用yum安装MySQL5.7,添加mysl-comunity.repo如下:[mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/ enabled=1 gpgcheck
标签:

MySQL5.7安装依赖包兼容问题:Error: Package: 2:postfix-2.10.1-6.el7.x86_64 (@anaconda)

使用yum安装MySQL5.7客户端,根据官方文档添加社区版的yum仓库mysql-community.repo。执行sudo yum install mysql-community-client 报错:Error: Package: 2:postfix-2.10.1-6.el7.x86_64 (@anaconda)      Requi
标签:

CentOS 7 安装Redis

redis安装都是通过源码编译安装。这里基于redis5

安装redis

在CentOS 上安装redis分三个步骤:下载,解压,编译

$ wget http://download.redis.io/releases/redis-5.0.7.tar.gz
$ tar xzf redis-5.0.7.tar.gz
$ cd redis-5.0.7
$ make

注意:这里需要在CentOS上预先安装好gcc。

编译成功后,会在redis安装目录的src下生成redis-server,redis-cli等bin文件。

启动redis服务器

$ src/redis-server &

最后的“&”表示后台启动redis。如果把&去掉,当你退出当前终端或者使用Ctrl+C时,redis服务器就会被关闭。

redis-cli访问redis数据库

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

这样就表示redis服务器启动成功。

MySQL 5.7设置用户密码过期

数据库mysql的user表里有三个字段用于控制用户密码过期的设置:

`password_expired` enum('N','Y'CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`password_last_changed` timestamp NULL DEFAULT NULL,
`password_lifetime` smallint(5) unsigned DEFAULT NULL,
  • password_expired:枚举值,设置用户密码是否过期的开关,默认为N。
  • password_last_changed:记录密码最近修改的时间
  • password_lifetime:设置密码的有效时间,天数

即使password_expired为"Y",用户也是可以使用密码登录MySQL,但是不允许做任何操作。使用过期密码登录执行操作报错如下:

mysql> SHOW DATABASES;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
Keep in mind that this does not affect any current connections the account has open.

MySQL支持全局设置和针对单独用户设置两种方式密码过期。

全局设置密码过期:default_password_lifetime

MySQL 5.7.4改进了用户密码过期的功能,新增了全局变量default_password_lifetime用于设置全局的用户密码过期策略。

default_password_lifetime可以在启动的配置文件my.cnf中配置,也可以使用命令行设置。

在my.cnf配置

[mysqld]
default_password_lifetime=90

default_password_lifetime的值为密码的有效天数。密码设置超过有效天数,密码过期失效。

default_password_lifetime的值为0时,表示用户设置的密码永不过期。

[mysqld]
default_password_lifetime=0

使用命令行配置

使用命令行设置需要有超级权限。

mysql> SET GLOBAL default_password_lifetime = 90;
Query OK, 0 rows affected (0.00 sec)

单个用户设置密码过期

针对单个用户设置密码过期将会覆盖全局的设置。

直接让用户密码过期

mysql> ALTER USER 'demo'@'localhost' PASSWORD EXPIRE;

指定过期天数

ALTER USER ‘demo’@‘localhost' PASSWORD EXPIRE INTERVAL 30 DAY;

设置用户密码永不过期

ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER;

curl post请求发送json数据两种方式(Window/Linux)

更新于 2022.07.26 12分钟阅读 0 评论 5 推荐

    常用Shell脚本

    作者: 新生
  1. 获取curl的http response状态码 Page 1
  2. curl post请求发送json数据两种方式(Window/Linux) Page 2
  3. Linux自定义$PATH环境变量 Page 5

设置请求头Content-Type

curl发送post请求,默认的content-type是:application/x-www-form-urlencoded。要发送json格式,则需要设置请求头的content-type为application/json

使用-H 或--header参数设置content type:

-H "Content-Type: application/json"

发送数据

发送数据使用的是-d--data参数,curl支持两种请求方式:

  • 直接在命令行中输入json字符串
  • 发送json文件

Linux命令行输入json字符串发送数据

curl -X POST http://localhost:8080/api -H "Content-Type: application/json" \
  -d '{"p1":"xyz","p2":"xyz"}'

其中:-d参数使用单引号括起整个字符串,json内容里的属性以及值使用双引号。

Windows命令行直接输入json字符串发送数据

这里特别要说明的是:Windows下,-d参数后不能使用单引号把发送的json字符串括起来,需要使用双引号。而json内容里的属性的双引号需要做转义:

curl -X POST http://localhost:8080/api -H "Content-Type: application/json" \
  -d "{\"p1\":\"xyz\",\"p2\":\"xyz\"}"

使用json文件发送数据

如果数据量比较大,则适合使用json文件发送。示例如下:

curl -X POST http://localhost:8080/api -H "Content-Type: application/json" -d @sendfile.json

注意:示例中的文件名是“sendfile.json”,需要在文件名前加上@符号。

 

MySQL 5.7 忘记root密码,使用--skip-grant-tables重置root密码的通用方法

这里主要介绍在不知MySQL的root密码的情况下,使用--skip-grant-tables关闭MySQL服务器的认证,从而可以重置root的密码。MySQL版本为5.7。

1、关闭MySQL

sudo service mysqld stop

2、使用--skip-grant-tables 和 --skip-networking 重启MySQL

sudo mysqld --skip-grant-tables  --skip-networking &

--skip-grant-tables:此选项会让MySQL服务器跳过验证步骤,允许所有用户以匿名的方式,无需做密码验证直接登陆MySQL服务器,并且拥有所有的操作权限。

--skip-networking:此选项会关门MySQL服务器的远程连接。这是因为以--skip-grant-tables方式启动MySQL服务器会有很大的安全隐患,为了降低风险,需要禁止远程客户端的连接。

3、本地连接mysql

shell> mysql

--skip-grant-tables已经关闭MySQL服务器的认证,以匿名方式,无需密码即可连接。

4、重置密码

在重置密码前,先要重载授权表:

mysql> FLUSH PRIVILEGES;

MySQL 5.7.6+:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

MySQL 5.7.6以及之后的版本,使用ALTER USER语法来修改密码。

MySQL 5.7.5以及之前的版本

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');

MySQL 5.7.5以及之前的版本使用SET PASSWORD语法修改密码。

如果上面的方法修改密码有错,可以直接修改mysql.user表:

UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

注意:mysql5.7 user表里已经去掉了password字段,改为了authentication_string。

5、重启服务器

service mysqld restart

因为之前使用--skip-grant-tables启动,所以需要重启mysql服务器,去掉--skip-grant-tables。

参考:https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

Linux自定义$PATH环境变量

$PATH变量内容

使用echo命令查看$PATH变量的值:

$ echo $PATH
/home/xx/bin:/home/xx/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/java/jdk/bin:/usr/java/jdk/jre/bin

$PATH变量保存了一个路径列表,每个路径之间使用冒号(:)隔开。

shell搜索命令的顺序

在Linux Shell上输入ls命令:

$ls
file1.txt  fold  file2.txt

回车后ls命令就马上执行,显示出当前目录的文件,包括文件夹。

ls安装在什么位置,shell是怎么找到命令执行的呢?这个我们要先知道Shell搜索命令的顺序。

#which  command

查找命令的安装位置,可以使用which命令,把需要查询位置的命令名,作为which的参数。 例如:

#which ls
alias ls='ls --color=auto'
       /usr/bin/ls

which命令输出的第一行,表示ls使用了alias命令设置了别名。第二行是ls命令所在的位置为/usr/bin/ls

Shell搜索命令顺序

如上图Shell执行命令的顺序是:Alias,函数,内建命令,Hash Table和$PATH,如果按以上顺序和当前路径下都没有找到,就会报command not found。

自定义$PATH

从上面知道,$PATH可以用于搜索命令。这样我们就可以把自己编写的脚本的目录放到$PATH变量里,这样我们就可以在任何目录中直接使用脚本名执行命令。

命令行使用export添加路径到$PATH

使用export按以下格式添加自己的路径到$PATH变量中:

export PATH=$PATH:/path/to/directory

命令的$PATH表示引用变量之前的值,使用冒号(:)隔开,接着添加自己的路径。

示例:

# export PATH=$PATH:/home/xx/scripts

这个表示把/home/xx/scripts添加到$PATH中。

永久设置$PATH

但以上方式在系统重启后就会失效,如果要永久设置$PATH,需要把export PATH命令添加到~/.bashrc~/.bash_profile中。

打开~/.bashrc

$ sudo vim ~/.bashrc

在文件最后添加:

export PATH=$PATH:/path/to/directory

保存文件后,执行source

$ source ~/.bashrc

这样你就可以在任何目录直接使用脚本名执行命令了。

MySQL开启general_log查看执行的SQL语句

general log会记录下发送给MySQL服务器的所有SQL记录,因为SQL的量大,默认是不开启的。一些特殊情况(如排除故障)可能需要临时开启一下。

开启MySQL的general log

MySQL有三个参数用于设置general log:

  • general_log:用于开启general log。ON表示开启,OFF表示关闭。
  • log_output:日志输出的模式。FILE表示输出到文件,TABLE表示输出到mysq库的general_log表,NONE表示不记录general_log。
  • general_log_file:日记输出文件的路径,这是log_output=FILE时才会输出到此文件。

1、查看先是否开启了general log

mysql> show variables where Variable_name="general_log";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log  | OFF  |
+---------------+-------+
1 row in set (0.00 sec)

2、查看日志输出模式

mysql> show variables where Variable_name="log_output"; 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output  | FILE |
+---------------+-------+
1 row in set (0.00 sec)

3、查看日志输出路径

mysql> show variables where Variable_name="general_log_file";
+------------------+----------------------------+
| Variable_name  | Value           |
+------------------+----------------------------+
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+
1 row in set (0.00 sec)

4、设置日志模式为TABLE,FILE双模式

mysql> set global log_output='TABLE,FILE';    
Query OK, 0 rows affected (0.00 sec)

5、开启general log

set global general_log=ON;

6、关闭general log

大多数情况是临时开启general log,需要记得关闭,并把日志的输出模式恢复为FILE。

set global general_log=OFF;
set global log_output='FILE'

general_log表

现在在mysql库的general_log表就可以查看到开启general log那段时间的SQL记录。

查看general_log的表结构:

mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
    Table: general_log
Create Table: CREATE TABLE `general_log` (
 `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `user_host` mediumtext NOT NULL,
 `thread_id` int(11) NOT NULL,
 `server_id` int(10) unsigned NOT NULL,
 `command_type` varchar(64) NOT NULL,
 `argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec)

查询得到

$select * from mysql.general_log limit 1 \G
*************************** 1. row ***************************
 event_time: 2018-01-05 17:35:45
  user_host: root[root] @ localhost []
  thread_id: 89429
  server_id: 2
command_type: Query
  argument: select * from mysql.general_log
1 row in set (0.00 sec)

MySQL安装系列:使用通用二进制文件在Unix/Linux安装

下载

页面下载

最新版本下载页面:https://dev.mysql.com/downloads/
操作系统选择:Linux - Generic

wget下载

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-i686.tar.gz

下载后的包为tar.gz。

环境准备

卸载旧的MySQL

如果系统已经使用软件管理包如,apt,yum等安装过MySQL,在安装新的MySQL服务器之前需要先把旧的MySQL整个相关文件卸载,包括旧版本的数据文件,以及配置文件/etc/my.cnf 或/etc/mysql。卸载MySQL时推荐使用系统的相应的软件管理包。

安装依赖

安装libaio

MySQL依赖libaio,在安装MySQL前需要检查系统是否安装了libaio。

1、yum安装libaio

shell> yum search libaio  # search for info
shell> yum install libaio # install library

2、apt安装libaio

shell> apt-cache search libaio # search for info
shell> apt-get install libaio1 # install library

安装libnuma(MySQL 5.7.19+)

MySQL 5.7.19新增了非统一内存访问(NUMA),它依赖于libnuma,所以也需要安装libnuma。

安装

安装过程需要切换到root权限。

创建mysql用户以及组

出于安全考虑,建议创建一个专门用于运行mysqld的用户以及组。一般情况下,用户和组都已mysql命名。

shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql

mysql用户不需要有登陆权限,-r -s /bin/false禁止了mysql用户登录权限。

解压安装包到安装目录

mysql的安装目录通常为/usr/local/mysql,先解压安装包到/usr/local,然后再链接到/usr/local/mysql。

shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql

设置环境变量

把mysql的安装目录添加到环境变量。

shell> export PATH=$PATH:/usr/local/mysql/bin

初始化数据目录

1、进入安装目录

shell> cd mysql

2、添加secure_file_priv变量的目录mysql-files用于限制导入导出到指定目录。

shell> mkdir mysql-files
shell> chmod 750 mysql-files

3、设置为mysql用户所属

shell> chown -R mysql .
shell> chgrp -R mysql .

4、初始化数据目录

MySQL5.7.6以及之后的版本

shell> bin/mysqld --initialize --user=mysql

MySQL5.7.6之前的版本

shell> bin/mysql_install_db --user=mysql

5、设置访问权限

shell> chown -R root .
shell> chown -R mysql data mysql-files

启动MySQL服务器

使用mysqld_safe启动MySQL服务器

shell> bin/mysqld_safe --user=mysql &

至此就完成了MySQL服务器的安装及启动

MySQL定时任务event

MySQL的Event可以用来设置定时任务。

MySQL配置开启Event定时任务功能

MySQL默认是关闭定时任务这个功能,在我们开始设置定时任务前,先检查下MySQL是否已经开启此选择

show variables like '%event_scheduler%';

如果为Off,两种方式可以对它进行修改

​ 1. set语句(当前启动的实例有效,重启后无效)

set global event_scheduler=1;

​ 2. 配置my.cnf下添加如下选项

[mysqld]
event_scheduler=ON 

此方式需要重启mysql。

创建定时任务事件

一般情况下,我们可以创建存储过程来作为定时任务的执行单元,如果只是简单sql,可以直接在定时任务中指定

CREATE EVENT `mydb`.`my_event`
ON SCHEDULE EVERY '1' DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)
ON completion preserve disable
DO call my_procedure();

CREATE EVENT mydb.my_event在mydb数据库中创建一个名为my_event事件

表示创建时间定时周期,以及开始时间,该处表示从明天1点从开始,每天执行一次该任务

第三行表示创建后并不开始生效

第四行表示需要执行的任务,其中my_procedure为我们自定义的存储过程。

查询定时任务事件

SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS;

开启/关闭已经创建好的事件

alter event event_name on completion preserve enable;//开启定时任务
alter event event_name on completion preserve disable;//关闭定时任务

如果你的全局参数没有配置开启定时任务,则会导致你虽然执行了开启已经创建好的事件,但是你在information_schema.EVENTS表中还是查询不到记录

定时设置

1、周期执行 – 关键字 EVERY

单位有:second, minute, hour, day, week(周), quarter(季度), month, year,如:

on schedule every 1 second      //每秒执行1次
on schedule every 2 minute      //每两分钟执行1次
on schedule every 3 day         //每3天执行1次

2、 在具体某个时间执行 – 关键字 AT, 如:

on schedule at current_timestamp()+interval 5 day   // 5天后执行
on schedule at current_timestamp()+interval 10 minute   // 10分钟后执行
on schedule at '2016-10-01 21:50:00'        // 在2016年10月1日,晚上9点50执行

3、 在某个时间段执行 – 关键字 STARTS ENDS, 如:

on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month // 5天后开始每天都执行执行到下个月底
on schedule every 1 day ends current_timestamp()+interval 5 day //从现在起每天执行,执行5天

 

获取curl的http response状态码

可以使用以下脚本获取curl请求返回的状态码:

curl -w '%{response_code}\n' -so /dev/null $URL

其中$URL是一个变量,可以使用实际测试的url替换。如请求百度:

curl -w '%{response_code}\n' -so /dev/null https://baidu.com

输出结果:

302

shell脚本变量的使用

问var=value 在export前后的差在哪? 

这次让我们暂时丢开command line,
先了解一下bash变量(variable)吧…

所谓的变量,就是利用一个固定的”名称”(name),
来存取一段可以变化的”值”(value)。

1. 变量设定(set)

在bash中, 你可以用”=”来设定或者重新定义变量的内容:

 name=value

 

在设定变量的时候,得遵守如下规则:

  • 等号左右两边不能使用分隔符号(IFS),也应避免使用shell的保留元字符(meta charactor);
  • 变量的名称(name)不能使用$符号;
  • 变量的名称(name)的首字符不能是数字(number)。
  • 变量的名称(name)的长度不可超过256个字符。
  • 变量的名称(name)及变量的值的大小写是有区别的、敏感的(case sensitive,)

如下是一些变量设定时常见的错误:
 

A= B #=号前后不能有IFS
1A=B #变量名称不能以数字开头
$A=B #变量的名称里有$
a=B  #这跟a=b是不同的,(这不是错误,提醒windows用户)

 

 

 

 

 

 

 

如下则是可以接受的设定:

A=" B" #IFS被关闭,参考前面的quoting章节
A1=B   #并非以数字开头
A=$B   #$可用在变量的值内
This_Is_A_Long_Name=b #可用_连接较长的名称或值,且有大小区别;

 

 

 

 

 

 

 

2. 变量替换(substitution)

shell 之所以强大,其中的一个因素是它可以在命令行中对变量作
替换(substitution)处理。
在命令行中使用者可以使用$符号加上变量名称(除了用=定义变量名称之外),
将变量值给替换出来,然后再重新组建命令行。

比方:
 

$ A=ls
$ B=la
$ C=/tmp
$ $A -$B $C

 

 

 

 

 

 

 

以上命令行的第一个$shell prompt, 并不在命令行之内。
必须强调的是,我们所提的变量替换,只发生在command line上面。
(是的,请让我们再次回到命令行吧!) 仔细分析,最后那行
command line,不难发现在被执行前(在输入CR字符之前),
$符号对每一个变量作替换处理(将变量的值替换出来再重组命令行),
最后会得出如下命令行:

ls -la /tmp

Note:

若从技术的细节来看,shell会依据IFS(Internal Field Seperator)
command line所输入的文字拆解为”字段”(word/field)。
然后再针对特殊字符(meta)先作处理,最后重组整行command line

这里的$就是command line中最经典的meta之一了,
就是作变量替换的。在日常的shell操作中,
我们常会使用echo命令来查看特定的变量的值,
例如:

$ echo $A -$B $C

 

echo命令只单纯将其argument送至”标准输出”(stdout, 通常是我们的屏幕)。
所以上面的命令会在屏幕上得到如下结果:

ls -al /tmp

 

这是由于echo命令在执行时,会先将$A (ls)、$B (la)跟$C (/tmp)给替换出来;
利用shell对变量的替换处理能力,我们在设定变量时就更为灵活了:

A=B
B=$A

 

 

 

这样,B的变量值就可继承A变量”当时”的变量值了。
不过,不要以”数学逻辑”来套用变量的设定,比方说:

A=B
B=C

 

 

 

这样,并不会让A的变量值变成C。再如:

A=B
B=$A
A=C

 

 

 

 

 

同样也不会让B的值变成C。

上面是单纯定义了两个不同名称的变量:
A 与 B, 它们的取值分别是C与B。

若变量被重复定义的话,则原有值为新值所取代。(这不正是”可变的量”吗?^_^)
当我们在设定变量的时候,请记住这点:用一个名称存储一个数值, 仅此而已。

此外, 我们也可以利用命令行的变量替换能力来”扩充”(append)变量的值:

A=B:C:D
A=$A:E

 

 

 

这样, 第一行我们设定A的值为”B:C:D”,
然后,第二行再将值扩充为”B:C:D:E”。

上面的扩充的范例,我们使用分隔符号(:)来达到扩充的目的,
要是没有分隔符的话,如下是有问题的:

A=BCD
B=$AE

 

 

 

因为第二次是将A的值继承$AE的替换结果,而非$A再加E。
要解决此问题,我们可用更严谨的替换处理:

A=BCD
A=${A}E

 

 

 

上例中,我们使用{}将变量名称范围给明确定义出来,
如此一来, 我们就可以将A的变量值从BCD给扩充为BCDE。

Tips:
关于${name}事实上还可以做到更多的变量处理能力,
这些均属于比较进阶阶段的变量处理,现阶段暂不介绍了,
请大家自行参考资料。

3. export 变量

严格来说,我们在当前shell中所定义的变量,均属于
“本地变量”(local variable), 只有经过export命令的
“输出”处理,才能成为”环境变量”(environment variable):

$ A=B
$ export A

 

 

 

或者

$ export A=B

 

经过export输出处理之后,变量A就能成为一个环境变量
供其后的命令使用。在使用export的时候,请别忘记
shell在命令行对变量的”替换”(substitution)处理。
比方说:

$ A=B
$ B=C
$ export $A

 

 

 

 

 

上面的命令并未将A输出为”环境变量”,而是将B导出
这是因为在这个命令行中,$A会首先被替换为B,然后在”塞回”
export的参数。

要理解这个export,事实上需要从process(进程)的角度来理解才能透彻。
 

4. 取消变量(unset)

要取消一个变量,在bash中可使用unset命令来处理:

unset A

 

export一样,unset命令行,也同样会作
变量替换(这其实是shell的功能之一),
因此:

$ A=B
$ B=C
$ unset $A

 

 

 

 

 

事实上,所取消的是变量B而不是A。

此外,变量一旦经过unset取消之后,
其结果是将整个变量拿掉,而不是取消变量的值。

如下两行其实是很不一样的:

$ A=
$ unset A

 

 

 

第一行只是将变量A设定为”空值”(null value),
但第二行则是让变量A不存在。
虽然用眼睛来看,
这两种变量的状态在如下的命令结果中都是一样的:
 

$ A=
$ echo $A
$ unset A
$ echo $A

 

 

 

 

 

 

 

 

大家务必能识别null value 与 unset的本质区别,
这在一些进阶的变量处理上是很严格的。

比方说:

$ str=    #设为null
$ var=${str=expr} #定义var
$ echo $var
$ echo $str
$ unset str #取消str
$ var=${str=expr} #定义var
$ echo $var
expr
$ echo $str
expr

MySQL使用LAST_DATE获取日期所在月份的最后一天

MySQL提供了LAST_DATE函数用来获取日期所在月份的最后一天:

LAST_DATE(date_col)

示例:

mysql> SELECT LAST_DATE(NOW());
2018-01-31

清空docker所有数据shell脚本

1、停掉所有的容器

docker stop `docker ps -qa`

2、删除dockers所有容器

docker rm `docker ps -qa`

3、删除所有镜像

docker rmi -f `docker images -qa `

4、删除所有volume

docker volume rm $(docker volume ls -qf)

删除所有网络设置

docker network rm `docker network ls -q`

到此就可以还原docker环境到开始安装的状态

可以执行以下命令确定docker环境是否干净

docker ps -a
docker images -a
docker volume ls
docker network ls

CentOS 7配置安装多个redis实例

1、给新redis实例创建redis配置(复制redis.conf)

$ cp /etc/redis.conf /etc/redis-xxx.conf

2、修改复制的redis-xxx.conf

...
#修改pidfile
#pidfile /var/run/redis/redis.pid
pidfile /var/run/redis/redis-xxx.pid
...
#dir /var/lib/redis/
dir /var/lib/redis-xxx/
...
#修改端口 port
#port 6379
port 6380
...
#修改日志文件路径 logfile
#logfile /var/log/redis/redis.log
logfile /var/log/redis/redis-xxx.log
...
#修改 vm-swap-file
#vm-swap-file /tmp/redis.swap
vm-swap-file /tmp/redis-xxx.swap
...

3、创建目录 /var/lib/redis-xxx

$ mkdir -p /var/lib/redis-xx

4、复制原来redis的service脚本

$ cp /usr/lib/systemd/system/redis.service /usr/lib/systemd/system/redis-xxx.service

5、修改新的redis-xxx.service脚本

...
#[Unit]
Description=Redis persistent key-value database
After=network.target
#[Service]
ExecStart=/usr/bin/redis-server /etc/redis-xxx.conf --daemonize no
ExecStop=/usr/bin/redis-shutdown
User=redis
Group=redis
#[Install]
WantedBy=multi-user.target
...

注意:这里只修改redis-xxx.conf路径,其他项目不需要修改。

6、启动:

$ service redis-xxx start

7、检查status:

$ service redis-xxx status

8、关闭:

$ service redis-xxx stop

9、重启:

$ service redis-xxx restart

10、问题

如果service找不到,可以先执行以下命令:

$ systemctl unmask packagekit.service
$ systemctl mask packagekit.service

然后重新运行service命令

Docker MySQL备份和恢复数据库命令

这两个命令用于对正在运行的Docker MySQL容器做备份和恢复

备份Docker MySQL

docker exec CONTAINER /usr/bin/mysqldump -u username --password=xxx DATABASE > backup.sql

从sql文件恢复到Docker MySQL

cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u username --password=xxx DATABASE

MySQL类型隐式转换规则

在MySQL语句里,如果操作符应用于不同的类型的操作数,为了兼容让操作数兼容,MySQL会对操作数做类型转换,有些是自动的隐式转换。

“+”号操作符

使用“+”号相加的是字符串或字符串和数字,字符串会隐式转换为数字。

以数字开头的字符串

以数字开头的字符串,它会截取前面的数字字符串,转换为对应的数字。

mysql> select '1a' + 1;
+----------+
| '1a' + 1 |
+----------+
|    2 |
+----------+
1 row in set, 1 warning (0.00 sec)

字符串'1a'转换为数字1。并且有一条警告提示。

mysql> show warnings;
+---------+------+----------------------------------------+
| Level  | Code | Message                |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '1a' |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

使用show  warnings查看警告,提示Truncated incorrect DOUBLE value: '1a',意思是对‘1a’做了截取

以字符开头的字符串

以字符开头的字符串,使用加号相加时会把字符串转换为0。

mysql> select 'a1' + 1; 
+----------+
| 'a1' + 1 |
+----------+
|    1 |
+----------+
1 row in set, 1 warning (0.00 sec)

这里把“1a”改为“a1”,字符串“a1”被转换为了0。

字符连接函数CONCAT()

mysql> SELECT CONCAT(1,' test'); 
+-------------------+
| CONCAT(1,' test') |
+-------------------+
| 1 test      |
+-------------------+
1 row in set (0.03 sec)

使用CONCAT函数连接多个字符串时,对于数字,它会自动隐式转换为字符串。

比较操作符

使用比较操作符比较数字与字符串时,字符串类型会隐式转换为数字。

示例

mysql> SELECT 1 > '6x';
0
mysql> SELECT 7 > '6x';
1
mysql> SELECT 0 = 'x6';
        -> 1
mysql> SELECT 'a' = '0';
0

使用>,<,=比较符比较数字和字符串,字符串转换为数字遵从:

  1. 以数字开头的字符串,截取前面的数字字符串,转换为对应的数字
  2. 以字符开头的字符串,字符串即使包含了数字,也会转换为0。
  3. 字符串与字符串的比较,即使是纯数字的字符串,这种情况下不做类型转换,如例子里的'a' = '0'

Where语句里的隐式转换

在Where语句里使用

SELECT * FROM tbl_name WHERE str_col=数字;

示例

SELECT * FROM user WHERE name = 0;

由于等式比较name=0,name会自动转换为0,所以name=0的结果为true。SELECT 语句会返回所有的数据。

MySQL 5.7账号锁定Account Lock

MySQL 5.7.8新增了Account Lock用于锁定账号。Account Lock可以在创建账号锁定,也可以使用ALTER USER语句进行锁定。

创建账号时锁定

mysql> CREATE USER 'demo'@'localhost' IDENTIFIED BY 'a123456' ACCOUNT LOCK;
Query OK, 0 rows affected (0.00 sec)

使用ALTER USER 语句锁定

mysql>ALTER USER 'demo'@'localhost' ACCOUNT UNLOCK;
Query OK, 0 rows affected (0.00 sec)

使用被锁账号登录会报ERROR 3118错误:

$ mysql -udemo -p
Enter password:
ERROR 3118 (HY000): Access denied for user 'demo'@'localhost'. Account is locked.

解锁账号

mysql>ALTER USER 'demo'@'localhost' ACCOUNT UNLOCK;
Query OK, 0 rows affected (0.00 sec)

MySQL5.7安装报错:GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql"

根据官方文档使用yum安装MySQL5.7,添加mysl-comunity.repo如下:

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

执行安装

sudo yum install mysql-community-server

报错

Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql


GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql"

原因及解决

yum仓库设置gpgcheck=1,下载安装时会去校验GPG key,本地找不到file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql就会报此错误。

解决方法:

  1. 禁用gpgcheck,设置gpgcheck=0即可
  2. 在指定的路径下添加GPG key文件

MySQL5.7安装依赖包兼容问题:Error: Package: 2:postfix-2.10.1-6.el7.x86_64 (@anaconda)

使用yum安装MySQL5.7客户端,根据官方文档添加社区版的yum仓库mysql-community.repo。

执行

sudo yum install mysql-community-client

报错:

Error: Package: 2:postfix-2.10.1-6.el7.x86_64 (@anaconda)
      Requires: libmysqlclient.so.18(libmysqlclient_18)(64bit)
      Removing: 1:mariadb-libs-5.5.56-2.el7.x86_64 (@anaconda)
        libmysqlclient.so.18(libmysqlclient_18)(64bit)
      Obsoleted By: mysql-community-libs-5.7.20-1.el6.x86_64 (mysql57-community)
        Not found
Error: Package: 2:postfix-2.10.1-6.el7.x86_64 (@anaconda)
      Requires: libmysqlclient.so.18()(64bit)
      Removing: 1:mariadb-libs-5.5.56-2.el7.x86_64 (@anaconda)
        libmysqlclient.so.18()(64bit)
      Obsoleted By: mysql-community-libs-5.7.20-1.el6.x86_64 (mysql57-community)
       ~libmysqlclient.so.20()(64bit)

大概意思是postfix-2.10.1-6.el7.x86_64包不兼容。

解决方法:

按错误提示,是因为系统已经安装了mariadb-libs-5.5.56-2.el7.x86_64,与mysql-community不兼容。

查看已安装的mariadb相关的包:

$ yum list installed mariadb\*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
mariadb-libs.x86_64       

移除mariadb-libs

sudo yum remove mariadb-libs

重新安装mysql-comunity-client

sudo yum install mysql-community-client