MySQL 知识点

配置

配置文件在/etc/mysql/my.cnf,一些配置内容如下:

max_connections        
    最大支持连接数,设置到500~1000比较合适
wait-timeout        
    数据库连接闲置最大时间值,默认值为8小时 

URL 格式

jdbc:mysql://[host][,failoverhost...][:port]/[database]
?[propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

常用参数:

参数名称 说明 默认值
useUnicode 是否使用Unicode字符集 false
characterEncoding 当useUnicode设置为true时,指定字符编码
autoReconnect 当数据库连接异常中断时,是否自动重新连接 false
autoReconnectForPools 是否使用针对数据库连接池的重连策略 false
failOverReadOnly 自动重连成功后,连接是否设置为只读 true
maxReconnects autoReconnect设置为true时,重试连接的次数 3
initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 2秒
connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时 0
socketTimeout socket操作(读写)超时,单位:毫秒。 0表示永不超时 0
useAffectedRows 是否用受影响的行数替代查找到的行数来返回数据,例如:当修改的内容与原数据相同,mysql自己返回受影响行数为0,但jdbc/mybatis 返回的却是1,返回的是 sql语句 的匹配行数

官方参数配置参考

配置主从数据库

主ip:192.186.0.101,从ip:192.186.0.102

主数据库配置

在/etc/mysql/my.cnf文件增加如下配置:

[mysqld]
#主数据库id
server-id=1
#需要同步的database
binlog-do-db=blog
#忽略同步的database
binlog-ignore-db=mysql
#开启二进制日志机制
log-bin=/var/lib/mysql/binlog

查看日志信息,得到二进制日志的文件名(file)和位置信息(position)

show master status

导主数据库已存在的数据

主数据库导出数据

mysqldump -uname -ppass database > database.sql

从数据库导入数据

source database.sql

从数据库配置

在/etc/mysql/my.cnf文件增加如下配置:

[mysqld]
#从数据库id,不能和主数据库的相同
server-id=2

配置同步参数

CHANGE MASTER TO 
MASTER_HOST='192.186.0.101',
MASTER_USER='root',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=154;

MASTER_HOST 主数据库所在服务器ip
MASTER_USER,MASTER_PASSWORD链接主数据库的用户密码
MASTER_LOG_FILE,MASTER_LOG_POS是从主数据库查到日志信息

启动同步进程

start slave
show slave status\G
    查看进程状态

进程状态有两个值,都为YES表示配置成功

Slave_IO_Runing 负责去主数据库读取二进制日志,并写入从数据库的中继日志
Slave_SQL_Runing 负责把中继日志转换sql执行

允许外网访问

注释/etc/mysql/mysql.conf.d/mysqld.cnf中

bind-address    = 127.0.0.1

查询用户

use mysql;
select user,host from user;

授权任意主机都可以以用户root和密码pass连接

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'pass' WITH GRANT OPTION;
flush privileges;

授权192.186.0.102主机都可以以用户root和密码pass连接

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.186.0.102' IDENTIFIED BY 'pass' WITH GRANT OPTION;
flush privileges;

编码问题

创建数据库表时指定编码和排序编码

CREATE DATABASE `test`  CHARACTER SET 'utf8'  COLLATE 'utf8_general_ci'; 
CREATE TABLE `test` () ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看默认编码

show variables like "%char%";

设置编码

SET character_set_client='utf8';  
SET character_set_connection='utf8';  
SET character_set_results='utf8';    

设置默认编码

set names utf8;

在/etc/mysql/my.cnf配置默认编码

[mysqld]
default_character_set=utf8;

问题

--initialize specified but the data directory has files in it. Aborting.

把/var/lib/mysql目录中文件删掉

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

flush privileges;

ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 42. Created with MySQL 50557, now running 50719. Please use mysql_upgrade to fix this error.

mysql_upgrade –force -uroot -p

ERROR 1054 (42S22): Unknown column 'Password' in 'field list'

update user set authentication_string=password(‘1111’) where user=’root’;

ERROR 1682 (HY000): Native table 'performance_schema'.'session_variables' has the wrong structure

sudo mysql_upgrade -u root -p, then restart mysql

ERROR 1467 (HY000): Failed to read auto-increment value from storage engine

auto-increment到最大值了。
use information_schema;
select * from TABLES where TABLE_NAME=’t_article_label’;

函数

字符串连接函数

concat(str1,str2)

有一个参数为null,就返回null

CONCAT_WS(separator,str1,str2,…)

以分隔符separator链接字符,如果有参数为null,跳过这个参数。

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

这是一个聚合函数,把有多个值的字段连接起来成一行。    

时间函数

from_unixtime()/unix_timestamp()

把Unix时间戳转换为日期/把日期转换为Unix时间戳

inet_aton()/inet_ntoa()

用无符号整数存储IP地址,把IP转换成整数/把整数转换成IP

date +/- interval expr unit

日期计算,例如:一天之前,select now() - interval 24 hour;

字符截取函数

left(str, len)

截取字符串中前len个字符

Vim命令

vim

删除

x, X       x 为向后删除一个字符, X为向前删除一个字符
nx         连续向后删除 n 个字符
dd         删除游标所在这行
ndd        删除游标所在向下n行
d1G        删除光标所在到第一行的所有数据
dG         删除光标所在到最后一行的所有数据
d$         删除游标所在处,到该行的最后一个字符
d0         删除游标所在处,到该行的最前面一个字符

复制

y1G        复制光标所在行到第一行的所有数据
yG        复制光标所在行到最后一行的所有数据
y0        复制光标所在的那个字符到该行行首的所有数据
y$        复制光标所在的那个字符到该行行尾的所有数据

粘贴

p,P        p粘贴到光标所在行的下一行,P所在行的上一行

撤销

u        复原上一个动作

重复执行

ctrl+r    再执行一次上一个动作;也可以按小数点'.' 一样的效果

替换
r,R r 会取代光标所在的那一个字符; R 会一直取代光标所在的文字,直到按下 ESC 为止

执行其他命令
:! command 离开 vi 到指令列模式下执行 command 的显示结果
行数
:set nu, :set nonu 显示行数和取消行数

翻页,移动光标
ctrl +f, +b, +d, +u 向后,前翻一页,向后,前翻半页
h, j, k, l 左,下,上,右
+, - 移动下一行,上一行的非空格符号
n, n 向右移动n 个字符, 向下移动n行
0, $ 移动行首,行尾
H, M, L 移动到屏幕的第一行,最后一行,中间行。
G, nG, gg 移动文档最后一行,第n行,第一行

搜索
n, N 向后,前继续搜索

Linux 知识点

源列表

Linux存放源有两个地方:/etc/apt/sources.list和/etc/apt/sources.list.d/*.list,后一个通常用来安装第三方的软件
sources.list文件内容:

开头是deb或者deb-src,通过.deb文件进行安装和通过源文件的方式进行安装。
URL后面的字符串,分别对应相应的目录结构。进入dists目录,就看到URL后目录结构

查看端口占用

lsof -i:端口号                            
    查看占用该端口的进程
netstat -ntlup | grep 端口号                  
    根据端口搜索进程
ps -ef | grep 进程号                        
    查看进程
netstat –apn                            
    查看所有的进程和端口使用情况
kill -9 processId                        
    杀进程

物理CPU、逻辑CPU和CPU核数

物理CPU

插槽上的CPU个数,物理cpu数量,可以数不重复的 physical id 有几个。

逻辑CPU

/proc/cpuinfo 文件,用来存储cpu硬件信息的.列出了processor 0 – n 的规格,n不是真实的cpu数
一颗cpu可以有多核,加上intel的超线程技术(HT), 可以在逻辑上再分一倍数量的cpu core
逻辑CPU数量=物理cpu数量 x cpu cores 这个规格值 x 2(如果支持并开启ht)

Linux下top查看的CPU也是逻辑CPU个数

查看物理CPU的个数

cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l

查看逻辑CPU的个数

cat /proc/cpuinfo |grep "processor"|wc -l

查看CPU是几核

cat /proc/cpuinfo |grep "cores"|uniq

查看内存、CPU使用情况

可用内存=系统free memory+buffers+cached

top                     查看内存和CPU    
pmap -d processId        查看进程相关信息占用的内存情况
free -m                 查看内存
cat /proc/meminfo        查看内存额定值
ll -h /proc/kcore        查看内存镜像文件的大小

apt-get清除文件

下面命令已清mysql相关文件

sudo apt-get purge mysql*
sudo apt-get autoremove
sudo apt-get autoclean

Ubuntu系统升级

sudo apt-get update && sudo apt-get dist-upgrade
sudo reboot
sudo update-manager –d

配置root权限

/etc/sudoers文件中配置了,那些用户可以临时获取root权限

授权给单个用户:
    devin    ALL=(ALL)ALL
解释:
    devin:允许使用 sudo 的用户名
    ALL:允许从任何终端(任何机器)使用 sudo
    (ALL):允许以任何用户执行 sudo 命令
    ALL:允许 sudo 权限执行任何命令

让用户 test 只能在本主机(主机名为epdc)以 root 账户执行/bin/chown、/bin/chmod 两条命令
    test epdc-ThinkPad-T550=(root)/bin/chown,/bin/chmod

授权某组用户,将“用户名”换成“%组名”即可。

使用时会要求你输入当前用户的密码,系统确实输入正确即以 root 权限来执行命令,接下来一段时间(默认为5分钟)再次使用 sudo 命令就不需要输密码了

添加用户

使用useradd或adduser命令,在centos是一样的,而ubuntu下useradd命令没有创建用户主目录

外部命令

shell 是一个交互式的应用程序,在执行外部命令时通过 fork 来创建一个子进程,再通过 exec 来加载外部命令的程序来执行,但是如果一个命令是 shell 内置命令,那么只能直接由 shell 来运行

使用 sudo 获得root shell 的权限,然后在root shell 中执行该命令。进入root shell 很简单,输入sudo bash 确认本用户的密码即可,此时你会发现命令提示符显示当前是 root。一旦获得root shell,你可以执行任何命令而不需要在每条命令前输入sudo了。

sudo 操作记录日志

sudo的日志功能就可以用户跟踪用户输入的命令,这不仅能增进系统的安全性,还能用来进行故障检修

第一步:创建/var/log/sudo.log文件
    sudo touch /va/log/sudo.log
第二步:修改/etc/rsyslog.conf配置文件,加入下面一行:
    local2.debug    /var/log/sudo.log    #空白不能用空格,必须用tab
第三步:修改/etc/sudoers配置文件,加入下面一行:
    Defaults    logfile=/var/log/sudo.log
第四步:重启syslog服务
    sudo service rsyslog restart

sudo命令

sudo 是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。Sudo不是对shell的一个代替,它是面向每个命令的。它的特性主要有这样几点:

  • sudo能够限制用户只在某台主机上运行某些命令。
  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
  • sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。
  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440。visudo来对该文件进行修改。强烈推荐使用该命令修改 sudoers

Linux疑难杂症解决方法

ssh远程主机被拒绝

1
2
epdc@epdc-ThinkPad-T550:~$ ssh localhost
ssh: connect to host localhost port 22: Connection refused

sudo apt-get install openssh-server

/etc/sudoers文件被破坏

1
2
3
4
5
6
epdc@epdc-ThinkPad-T550:/etc$ sudo gedit sudoers
>>> /etc/sudoers: syntax error near line 1 <<<
>>> /etc/sudoers: syntax error near line 1 <<<
sudo:/etc/sudoers 中第 1 行附近有解析错误
sudo:no valid sudoers sources found, quitting
sudo:无法初始化策略插件
  • 重启ubuntu,启动时按Esc或Shift键,可以看到引导选项;
  • 在引导选项中选择Recovery模式的那一项来引导;
  • 进入Recovery Menu页面,选择root,也就是进入试用root用户进行系统恢复,在这里可以执行超级用户的权限的操作,回车后可以看到熟悉的 root@user ~# 命令提示符;
  • 设置或者撤销/etc/sudoers文件的权限,也可以将该文件改回到发生错误之前的状态。

    chmod 666 /dev/null
    mount -o remount rw /
    vi /etc/sudoers
    恢复本文件内容并存盘

  • 退出Recovery模式,重新启动ubuntu。

无法解析或打开软件包的列表或是状态文件解决方案

E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/cn.archive.ubuntu.com_ubuntu_dists_
natty_main_i18n_Translation-en

sudo rm /var/lib/apt/lists/* -vf

apt-get安装出现错误

E: Sub-process /usr/bin/dpkg returned an error code (1)

apt-get update

加密、解密

Base64

  Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用‘=’,因此编码后输出的文本末尾可能会出现‘=’。

Hexo的配置

设置主题

 官方主题网站,在主题下载放到themes目录。然后修改_config.yml配置文件
 

评论插件

 使用的是Cafe主题,由于多说项目关闭,所以使用时国外Disqus评论。

 Cafe的_config.yml配置文件有说明,在博客的_config.yml文件配置disqus的账号就可以
 

注册Disqus账号

 在admin里,setting里的shortname名字才是配置到_config.yml文件中的
 

分类

 配置像这个分层次的分类
 
 

标题

使用markdown的#标题时,#和标题要隔个空格,否则解析不了。

云标签

 把Cafe的tagcloud_color设置为true
 

配置关于界面

 使用hexo new page “about”创建about的页面,在_config.yml中可以修改about名称
 

文章中插入图片

 在博客的_config.yml文件设置post_asset_folder为true。在建立文件时,Hexo会自动建立一个与文章同名的文件夹,用来放资源的。
然后安装hexo-asset-image插件npm install hexo-asset-image –save。通过下面方法就可以在文章插入图片。

1
2
![logo](本地图片测试/logo.jpg) 其中[]里面不写文字则没有图片标题。
而{% asset_img example.jpg this is an example image %} 生成HTML文件图片路径错误

RSS订阅

执行命令安装插件

1
npm install hexo-generator-feed --save

在博客的_config.yml文件配置

1
2
3
4
5
6
7
8
9
# RSS订阅支持
plugin:
- hexo-generator-feed
# Feed Atom
feed:
type: atom
path: atom.xml
limit: 20

Google Analytics

 在主题的_config.yml文件配置如下,id是Google Analytics生成的追踪id,需要去Google Analytics官网创建。

1
2
3
4
google_analytics:
enable: true
id: UA-97173941-1
site: auto

提交搜索引擎(百度+谷歌)

 参考博客

Git常遇到问题场景

删除仓库中目录或文件

 git rm -r 目录 或者 git rm 文件
 git commit -m “” 提交
 误删可以恢复
 git checkout – 文件

忽略特殊文件

 在git工作区间根目录创建.gitignore文件,然后把要忽略的文件添加进去。
 Window环境创建该文件会提示输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore 然后把该文件提交到git
 A、被忽略的文件,要强制添加到git
   git add -f 文件
 B、查看忽略文件被个规则忽略了
   git check-ignore -v 文件
 常见的忽略文件:https://github.com/github/gitignore

撤销文件修改

 A、已经git add到暂存区,如图:
 
 
 git reset HEAD file 可把暂存区的修改销掉,重新放回工作区
 git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。


 B、还没git add到暂存区,如图:
 
 git checkout – 文件 丢弃工作区的修改
 命令“git checkout – 文件”是:把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
 一种是readme.txt自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;
 一种是readme.txt已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。

删除仓库中文件,本地文件保留

 git rm –cached filename
 git rm -r –cached path

让git push命令不需要密码

 GitHub获得远程库时,有ssh方式和https方式。使用ssh时保存密钥对以后可以不再输入帐号密码,而https却不能。已经存在的项目修改.git目录下的config文件中的url。

中文显示问题

git config –global core.quotepath false

还原文件内容

使用git checkout file 还原本地修改。如果文件没有add到缓存区,使用IDE的Local History记录,来恢复原来被还原文件的修改内容。

Redis 学习

Redis安装

/bin/sh: 1: cc: not found

需要安装gcc

fatal error: jemalloc/jemalloc.h: No such file or directory

博客http://blog.csdn.net/bugall/article/details/45914867

You need tcl 8.5 or newer in order to run the Redis test

可以不运行redis test, tcl官网http://www.linuxfromscratch.org/blfs/view/cvs/general/tcl.html

启动

redis-server start    
/etc/init.d/redis_6379 start

停止

redis-cli shutdown

Redis代码访问

java.lang.ClassNotFoundException: redis.clients.jedis.GeoUnit

jedis包版本问题

Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: 
Could not get a resource from the pool
java.net.SocketTimeoutException: connect timed out

redis配置文件,绑定了id,把bind 127.0.0.1注释掉

Redis 命令学习

(error) NOAUTH Authentication required.

通过auth输入密码,auth “yourpassword”

删除所有的key

redis-cli keys "*" | xargs redis-cli del
redis-cli -a 123456 keys "*" | xargs redis-cli -a 123456 del
    需要指定密码
redis-cli -n 0 keys "*" | xargs redis-cli -n 0 del
    指定删除那个库,默认0
flushdb        
    删掉当前数据库的所有key
flushall

错误

1
redis.clients.jedis.exceptions.JedisConnectionException: Unknown reply: N

SQL语句说明

MySQL

数据库数据导入导出

1
2
3
4
5
6
7
8
9
10
mysqldump -u用户名 -p密码 数据库名 > 导出的文件名
导出整个数据库
mysqldump -u用户名 -p密码 数据库名 表名> 导出的文件名
导出一个表,包括表结构和数据
mysqldump -u用户名 -p密码 -d 数据库名 > e:\sva_rec.sql
导出一个数据库结构
mysqldump -u用户名 -p 密码 -d数据库名 表名> 导出的文件名
导出一个表,只有表结构
source sql文件
导入数据库

连接数及状态信息

show status like '%connect%'
    show status  查看所有状态参数,Threads_connected 当前的连接数,Connections 试图连接,max_used_connections并发过过最大数量
show processlist;
    显示当前正在执行的mysql连接
mysqladmin -u -p -h status
    显示当前mysql状态
mysqladmin -u -p -h extended-status
    显示mysql的其他状态

配置

show variables like 'max_allowed_packet';
    查看MySQL变量

把查询结果导出到文件中

mysql -h 127.0.0.1 -u root -p XXXX -P 3306 blog -Ne "select * from table"  > /tmp/test/txt
-N 输出到文件内容不带表字段名

1
2
3
4
describe t_user
查看表结构
alter table t_user modify id smallint(5) unsigned;
修改字段类型

查看表结构

desc 表名;
show columns from 表名;
show create table 表名;

use information_schema
select * from columns where table_name='表名'

函数

show function status;                 查看自定义函数
show create function fun_name;        查看函数源码

Hexo 搭建个人博客

准备环境

使用Hexo搭建个人博客,需要安装Node.jsGit,最后安装Hexo

1
npm install -g hexo-cli

建站

生产博客网站需要的资源,随便指定一个目录名字

1
2
3
hexo init <folder>
cd <folder>
npm install

执行命令,出现错误Error: Cannot find module ‘/root/hexo_blog/node_modules/dtrace-provider/scripts/install.js’,可能是Node.js版本兼容,可以低版本。我的安装环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ hexo -v
hexo: 3.2.2
hexo-cli: 1.0.2
os: Windows_NT 6.1.7601 win32 x64
http_parser: 2.7.0
node: 6.9.5
v8: 5.1.281.89
uv: 1.9.1
zlib: 1.2.8
ares: 1.10.1-DEV
icu: 57.1
modules: 48
openssl: 1.0.2k

关联GitHub

把博客网站资源放到Github上,这样可以通过互联网访问。在GitHub上创建一个仓库,名字为youname.github.io,必须是这格式。然后在hexo资源目录下的_config.yml文件最后加上:

1
2
3
4
deploy:
type: git
repository: https://github.com/duansiman/duansiman.github.io.git
branch: master

最后生产资源文件,部署到GitHub上。

1
2
hexo g
hexo d

访问地址duansiman.github.io

发表文章

执行如下命令,会生成md文件。然后生成资源文件,部署到Github上。

1
hexo new "article title"

推荐编辑md文件工具MarkdownPad,它的注册码