From 01264f0ce3be6c7d493553c4c5d6c64713c7fb77 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Fri, 15 Apr 2016 17:57:33 +0800 Subject: [PATCH 001/730] =?UTF-8?q?2016-04-15=E5=AE=8C=E5=96=84vim?= =?UTF-8?q?=E5=92=8Cvmware=E5=A4=8D=E5=88=B6=E4=B8=A4=E7=AF=87=E6=96=87?= =?UTF-8?q?=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CentOS-Virtual-Machine-Copy-Settings.md | 5 +++- Vim-Install-And-Settings.md | 28 ++++++++++++------ ...ntOS-Virtual-Machine-Copy-Settings-a-1.png | Bin 0 -> 23224 bytes images/Vim-Cut-And-Paste-a-1.png | Bin 0 -> 60066 bytes 4 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 images/CentOS-Virtual-Machine-Copy-Settings-a-1.png create mode 100644 images/Vim-Cut-And-Paste-a-1.png diff --git a/CentOS-Virtual-Machine-Copy-Settings.md b/CentOS-Virtual-Machine-Copy-Settings.md index 6240a11a..43c398ad 100644 --- a/CentOS-Virtual-Machine-Copy-Settings.md +++ b/CentOS-Virtual-Machine-Copy-Settings.md @@ -2,7 +2,10 @@ ## 概述 -- 在我们需要多台 CentOS 虚拟机的时候,对已有虚拟机的系统进行克隆或是复制。但是这样做又有一个问题,克隆出来的虚拟机启动的时候你输入命令:`ifconfig`,eth0 网卡信息没了,只有一个 eth1。 对于处女座的人来讲这是不允许的。所以我们需要改动下. +- 在我们需要多台 CentOS 虚拟机的时候,对已有虚拟机的系统进行克隆或是复制。但是这样做又有一个问题,克隆出来的虚拟机启动的时候你输入命令:`ifconfig`,eth0 网卡信息没了,只有一个 eth1。 对于处女座的人来讲这是不允许的。所以我们需要改动下。 +- 复制虚拟机后,首次打开该会提示如下内容,一般选择 copy 这个配置。 + - ![vim](images/CentOS-Virtual-Machine-Copy-Settings-a-1.png) + ## 修改方法 diff --git a/Vim-Install-And-Settings.md b/Vim-Install-And-Settings.md index 9029cf7d..d2540a62 100644 --- a/Vim-Install-And-Settings.md +++ b/Vim-Install-And-Settings.md @@ -74,15 +74,16 @@ - 粘贴 - `p`,将粘贴板中内容复制到 **光标之后** - `P`,将粘贴板中内容复制到 **光标之前** - - `ddp`,交换当前光标所在行和下一行的位置 - - `u`,撤销 - - `:wq`,退出并 **保存** - - `:q!`,退出并 **不保存** - - `Ctrl + v`,进入 Vim 列编辑 - - `guu`,把当前行的字母全部转换成 **小写** - - `gUU`,把当前行的字母全部转换成 **大写** - - `g~~`,把当前行的字母是大写的转换成小写,是小写的转换成大写 - - `:saveas /opt/setups/text.txt`,另存到 /opt/setups/text.txt + - 其他 + - `ddp`,交换当前光标所在行和下一行的位置 + - `u`,撤销 + - `:wq`,退出并 **保存** + - `:q!`,退出并 **不保存** + - `Ctrl + v`,进入 Vim 列编辑 + - `guu`,把当前行的字母全部转换成 **小写** + - `gUU`,把当前行的字母全部转换成 **大写** + - `g~~`,把当前行的字母是大写的转换成小写,是小写的转换成大写 + - `:saveas /opt/setups/text.txt`,另存到 /opt/setups/text.txt - 搜索 - `/YouMeek`,从光标开始处向文件尾搜索 YouMeek 字符,按 `n` 继续向下找,按 `N` 继续向上找 - `?YouMeek`,从光标开始处向文件首搜索 YouMeek 字符,按 `n` 继续向下找,按 `N` 继续向上找 @@ -95,6 +96,15 @@ - `:10,31s/YouMeek/Judasng`,把第 10 行到 31 行之间所有 YouMeek 替换为 Judasn +## Vim 的特殊复制、黏贴 + +- Vim 提供了 12 个剪贴板,分别是:`0,1,2,3,4,5,6,7,8,9,a,"`,默认采用的是 `"`,也就是双引号,可能你初读感觉很奇怪。你可以用 Vim 编辑某个文件,然后输入:`:reg`。你可以看到如下内容: + - ![vim](images/Vim-Cut-And-Paste-a-1.png) +- 复制到某个剪切板的命令:`"7y`,表示使用 7 号剪切板。 +- 黏贴某个剪切板内容:`"7p`,表示使用 7 号剪切板内容进行黏贴 + + + ## Vim 配置 - 我个人本地不使用 Vim 的,基本上都是在操作服务器的时候使用,所以这里推荐这个配置文件 diff --git a/images/CentOS-Virtual-Machine-Copy-Settings-a-1.png b/images/CentOS-Virtual-Machine-Copy-Settings-a-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2ba95a736a62ff071b5dcfcf64bd34a0903f0a GIT binary patch literal 23224 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 G6!{Mr=_P;w literal 0 HcmV?d00001 diff --git a/images/Vim-Cut-And-Paste-a-1.png b/images/Vim-Cut-And-Paste-a-1.png new file mode 100644 index 0000000000000000000000000000000000000000..efa41edfd5d48404ddc2d5b899c3245c83a000ce GIT binary patch literal 60066 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 c)dcnnV-*7^00~CqOB;A3fffY7iNhzRx0|^e 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
4WOPsn^5aq8Vnuu0)}R%+9oslC9gB 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 F{{SM)Yd!z~ literal 0 HcmV?d00001 From 4c54196c2fafc5ce6e6ea7fe503401f5868fbaba Mon Sep 17 00:00:00 2001 From: YouMeek Date: Fri, 15 Apr 2016 22:53:29 +0800 Subject: [PATCH 002/730] =?UTF-8?q?2016-04-15=E4=BF=AE=E6=94=B9mysql?= =?UTF-8?q?=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 4f6e6cf3..81c49f57 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -18,8 +18,9 @@ - Mysql 5.6 下载:`wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.29.tar.gz` (大小:31 M) - Mysql 5.7 下载:`wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.11.tar.gz` (大小:47 M) - 我们这次安装以 5.6 为实例 + - 进入下载目录:`cd /opt/setups` - 解压压缩包:`tar zxvf mysql-5.6.29.tar.gz` - - 移到解压包:`mv mysql-5.6.29/ /usr/program/` + - 移到解压包:`mv /opt/setups/mysql-5.6.29 /usr/program/` - 安装依赖包、编译包:`yum install -y make gcc-c++ cmake bison-devel ncurses-devel` - 进入解压目录:`cd /usr/program/mysql-5.6.29/` - 生成安装目录:`mkdir -p /usr/program/mysql/data` From 4417ea56817b0f1517050f3d0e8a30d7f6b27e96 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Fri, 15 Apr 2016 23:26:14 +0800 Subject: [PATCH 003/730] =?UTF-8?q?2016-04-15=E4=BF=AE=E6=94=B9mysql?= =?UTF-8?q?=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 81c49f57..53e2507a 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -51,6 +51,8 @@ - 默认安装情况下,root 的密码是空,所以为了方便我们可以设置一个密码,假设我设置为:123456 - 终端下执行:`mysql -uroot` - 现在进入了 mysql 命令行管理界面,输入:`SET PASSWORD = PASSWORD('123456');` +- 修改密码后,终端下执行:`mysql -uroot -p` + - 根据提示,输入密码进度 mysql 命令行状态。 From 9a598334a9bfd3779ca0eac17df82cb5c98150e3 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sat, 16 Apr 2016 18:55:54 +0800 Subject: [PATCH 004/730] =?UTF-8?q?2016-04-16=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=EF=BC=8CNTP=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 57 +++++++++++++++++++++++++++++------ NTP.md | 7 +++-- README.md | 2 +- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 53e2507a..479b97de 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -24,7 +24,7 @@ - 安装依赖包、编译包:`yum install -y make gcc-c++ cmake bison-devel ncurses-devel` - 进入解压目录:`cd /usr/program/mysql-5.6.29/` - 生成安装目录:`mkdir -p /usr/program/mysql/data` - - 生成配置:`sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/program/mysql -DMYSQL_DATADIR=/usr/program/mysql/data -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS:STRING=utf8 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1` + - 生成配置(使用 InnoDB):`sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/program/mysql -DMYSQL_DATADIR=/usr/program/mysql/data -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS:STRING=utf8 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1` - 更多参数说明可以查看: - 编译:`sudo make`,这个过程比较漫长,一般都在 30 分钟左右,具体还得看机子配置,如果最后结果有 error,建议删除整个 mysql 目录后重新解压一个出来继续处理 - 安装:`sudo make install` @@ -53,14 +53,39 @@ - 现在进入了 mysql 命令行管理界面,输入:`SET PASSWORD = PASSWORD('123456');` - 修改密码后,终端下执行:`mysql -uroot -p` - 根据提示,输入密码进度 mysql 命令行状态。 +- 如果你在其他机子上连接该数据库机子报:**Access denied for user 'root'@'localhost' (using password: YES)** + - 解决办法: + - 在终端中执行:`service mysql stop` + - 在终端中执行:`/usr/program/mysql/bin/mysqld --skip-grant-tables` + - 此时 MySQL 服务会一直处于监听状态,你需要另起一个终端窗口来执行接下来的操作 + - 在终端中执行:`mysql -u root mysql` + - 进入 MySQL 命令后执行:`UPDATE user SET Password=PASSWORD('填写你要的新密码') where USER='root';FLUSH PRIVILEGES;` + - 重启 MySQL 服务:`service mysql restart` + + +## Mysql 配置 + +- 官网配置参数解释: +- 找一下当前系统中有多少个 my.cnf 文件:`find / -name "my.cnf"`,我查到的结果: + ``` nginx + /etc/my.cnf + /usr/program/mysql/my.cnf + /usr/program/mysql/mysql-test/suite/ndb/my.cnf + /usr/program/mysql/mysql-test/suite/ndb_big/my.cnf + ............. + /usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf + ``` + - 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 ## MySQL 主从复制 +### 环境说明和注意点 + - 假设有两台服务器,一台做主,一台做从 - MySQL 主信息: - - IP:**12.168.1.113**= + - IP:**12.168.1.113** - 端口:**3306** - MySQL 从信息: - IP:**12.168.1.115** @@ -68,13 +93,16 @@ - 注意点 - 主 DB server 和从 DB server 数据库的版本一致 - 主 DB server 和从 DB server 数据库数据一致 - - 主 DB server 开启二进制日志,主 DB server 和从 DB server 的 server_id 都必须唯一 + - 主 DB server 开启二进制日志,主 DB server 和从 DB server 的 server-id 都必须唯一 - 优先操作: - - 把主库的数据库复制到从库并导入 + - **把主库的数据库复制到从库并导入** + +### 主库机子操作 + - 主库操作步骤 - - 创建一个目录:`mkdir -p /usr/program/mysql/data/log-bin` - - 主 DB 开启二进制日志功能:`vim /usr/program/mysql/my.cnf`, - - 添加一行:`log-bin = /usr/program/mysql/data/log-bin` + - 创建一个目录:`mkdir -p /usr/program/mysql/data/mysql-bin` + - 主 DB 开启二进制日志功能:`vim /etc/my.cnf`, + - 添加一行:`log-bin = /usr/program/mysql/data/mysql-bin` - 指定同步的数据库,如果不指定则同步全部数据库,其中 ssm 是我的数据库名:`binlog-do-db=ssm` - 重启主库 MySQL 服务 - 进入 MySQL 命令行状态,执行 SQL 语句查询状态:`SHOW MASTER STATUS` @@ -82,12 +110,22 @@ - 设置授权用户 slave01 使用 123456 密码登录主库,这里 @ 后的 IP 为从库机子的 IP 地址,如果从库的机子有多个,我们需要多个这个 SQL 语句。 ``` SQL - grant replication slave on *.* to 'slave01'@'192.168.1.133' identified by '123456'; + grant replication slave on *.* to 'slave01'@'192.168.1.135' identified by '123456'; flush privileges; ``` -- 从库操作步骤 +### 从库机子操作 + + +- 从库操作步骤 +- 测试从库机子是否能连上主库机子:`sudo mysql -h 192.168.1.105 -u slave01 -p`,必须要连上下面的操作才有意义。 + - 由于不能排除是不是系统防火墙的问题,所以建议连不上临时关掉防火墙:`service iptables stop` + - 或是添加防火墙规则: + - 添加规则:`sudo iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT` + - 保存规则:`sudo service iptables save` + - 重启 iptables:`sudo service iptables restart` +- 修改配置文件:`vim /etc/my.cnf`,把 server-id 改为跟主库不一样 - 在进入 MySQL 的命令行状态下,输入下面 SQL: ``` SQL @@ -104,6 +142,7 @@ master_log_pos=1120;>>>这个值复制刚刚让你记录的值 - 执行该 SQL 语句,查看从库机子同步状态:`SHOW SLAVE STATUS;` - 在查看结果中必须下面两个值都是 Yes 才表示配置成功: - `Slave_IO_Running:Yes` + - 如果不是 Yes 也不是 No,而是 Connecting,那就表示从机连不上主库,需要你进一步排查连接问题。 - `Slave_SQL_Running:Yes` - 如果你的 Slave_IO_Running 是 No, 那你可以检查从库下的错误日志:`cat /usr/program/mysql/data/mysql-error.log` - 如果里面提示 uuid 错误,你可以编辑从库的这个配置文件:`vim /usr/program/mysql/data/auto.cnf`,把配置文件中的:server-uuid 值随便改一下,保证和主库是不一样的。 diff --git a/NTP.md b/NTP.md index e88db50f..ee60ae58 100644 --- a/NTP.md +++ b/NTP.md @@ -24,8 +24,11 @@ - 启动服务: - `sudo service ntpd start` - 服务加到启动项 - - `sudo apt-get install -y sysv-rc-conf ` - - `sudo sysv-rc-conf ntpd on` + - CentOS 系统 + - `sudo chkconfig ntpd on` + - Ubuntu 系统 + - `sudo apt-get install -y sysv-rc-conf ` + - `sudo sysv-rc-conf ntpd on` ## NTP 资料 diff --git a/README.md b/README.md index 42d035f8..7964707c 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ - [Jenkins 安装和配置](Jenkins-Install-And-Settings.md) - [Maven 安装和配置](Maven-Install-And-Settings.md) - [Nexus 安装和配置](Nexus-Install-And-Settings.md) -- [Mysql 安装和配置](Mysql-Install-And-Settings.md) +- [MySQL 安装和配置](Mysql-Install-And-Settings.md) - [Redis 安装和配置](Redis-Install-And-Settings.md) - [Solr 安装和配置](Solr-Install-And-Settings.md) - [Jira 安装和配置](Jira-Install-And-Settings.md) From d05a2ca716078e01202c283babb16e1be42cd05c Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sat, 16 Apr 2016 18:59:25 +0800 Subject: [PATCH 005/730] =?UTF-8?q?2016-04-16=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=EF=BC=8CNTP=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 479b97de..5046e062 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -105,7 +105,7 @@ - 添加一行:`log-bin = /usr/program/mysql/data/mysql-bin` - 指定同步的数据库,如果不指定则同步全部数据库,其中 ssm 是我的数据库名:`binlog-do-db=ssm` - 重启主库 MySQL 服务 - - 进入 MySQL 命令行状态,执行 SQL 语句查询状态:`SHOW MASTER STATUS` + - 进入 MySQL 命令行状态,执行 SQL 语句查询状态:`SHOW MASTER STATUS;` - 在显示的结果中,我们需要记录下 **File** 和 **Position** 值,等下从库配置有用。 - 设置授权用户 slave01 使用 123456 密码登录主库,这里 @ 后的 IP 为从库机子的 IP 地址,如果从库的机子有多个,我们需要多个这个 SQL 语句。 From 13d79fffe7aacc2ddca03d0c38a13ab4256f274b Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 13:58:23 +0800 Subject: [PATCH 006/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84CPU?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- centos-settings/Cpu-Info.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/centos-settings/Cpu-Info.md b/centos-settings/Cpu-Info.md index e886076f..ab74ba39 100644 --- a/centos-settings/Cpu-Info.md +++ b/centos-settings/Cpu-Info.md @@ -14,7 +14,7 @@ - `grep 'physical id' /proc/cpuinfo | sort -u | wc -l`,查看物理 CPU 个数 - 结果:2 - 物理 CPU:物理 CPU 也就是机器外面就能看到的一个个 CPU,每个物理 CPU 还带有单独的风扇 -- `grep 'core id' /proc/cpuinfo | sort -u | wc -l`,查看每个物理 CPU 的核心数量 +- `grep 'core id' /proc/cpuinfo | sort -u | wc -l`,查看每个物理 CPU 的核心数量,一般也叫做:逻辑 CPU 数量 - 结果:6,因为每个物理 CPU 是 6,所有 2 个物理 CPU 的总核心数量应该是:12 - 核心数:一个核心就是一个物理线程,英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥 CPU 性能,意思是一个核心可以有多个线程。 - `grep 'processor' /proc/cpuinfo | sort -u | wc -l`,查看 CPU 线程数 From f0bf0e1e6b7aa27d687615016520cb339124cddb Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 14:06:20 +0800 Subject: [PATCH 007/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84CPU?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- centos-settings/Cpu-Info.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/centos-settings/Cpu-Info.md b/centos-settings/Cpu-Info.md index ab74ba39..3097f822 100644 --- a/centos-settings/Cpu-Info.md +++ b/centos-settings/Cpu-Info.md @@ -14,9 +14,9 @@ - `grep 'physical id' /proc/cpuinfo | sort -u | wc -l`,查看物理 CPU 个数 - 结果:2 - 物理 CPU:物理 CPU 也就是机器外面就能看到的一个个 CPU,每个物理 CPU 还带有单独的风扇 -- `grep 'core id' /proc/cpuinfo | sort -u | wc -l`,查看每个物理 CPU 的核心数量,一般也叫做:逻辑 CPU 数量 +- `grep 'core id' /proc/cpuinfo | sort -u | wc -l`,查看每个物理 CPU 的核心数量 - 结果:6,因为每个物理 CPU 是 6,所有 2 个物理 CPU 的总核心数量应该是:12 - 核心数:一个核心就是一个物理线程,英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥 CPU 性能,意思是一个核心可以有多个线程。 -- `grep 'processor' /proc/cpuinfo | sort -u | wc -l`,查看 CPU 线程数 +- `grep 'processor' /proc/cpuinfo | sort -u | wc -l`,查看 CPU 线程数,一般也叫做:逻辑 CPU 数量 - 结果:24,正常情况下:CPU 的总核心数量 == CPU 线程数,但是如果该 CPU 支持超线程,那结果是:CPU 的总核心数量 X 2 == CPU 线程数 - 线程数:线程数是一种逻辑的概念,简单地说,就是模拟出的 CPU 核心数。比如,可以通过一个 CPU 核心数模拟出 2 线程的 CPU,也就是说,这个单核心的 CPU 被模拟成了一个类似双核心 CPU 的功能。 From 99708aa04d5d5dafa567753ecf9c9ee5299619d7 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 14:07:13 +0800 Subject: [PATCH 008/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84CPU?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- centos-settings/Cpu-Info.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/centos-settings/Cpu-Info.md b/centos-settings/Cpu-Info.md index 3097f822..fb653ca6 100644 --- a/centos-settings/Cpu-Info.md +++ b/centos-settings/Cpu-Info.md @@ -17,6 +17,6 @@ - `grep 'core id' /proc/cpuinfo | sort -u | wc -l`,查看每个物理 CPU 的核心数量 - 结果:6,因为每个物理 CPU 是 6,所有 2 个物理 CPU 的总核心数量应该是:12 - 核心数:一个核心就是一个物理线程,英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥 CPU 性能,意思是一个核心可以有多个线程。 -- `grep 'processor' /proc/cpuinfo | sort -u | wc -l`,查看 CPU 线程数,一般也叫做:逻辑 CPU 数量 +- `grep 'processor' /proc/cpuinfo | sort -u | wc -l`,查看 CPU 总的线程数,一般也叫做:逻辑 CPU 数量 - 结果:24,正常情况下:CPU 的总核心数量 == CPU 线程数,但是如果该 CPU 支持超线程,那结果是:CPU 的总核心数量 X 2 == CPU 线程数 - 线程数:线程数是一种逻辑的概念,简单地说,就是模拟出的 CPU 核心数。比如,可以通过一个 CPU 核心数模拟出 2 线程的 CPU,也就是说,这个单核心的 CPU 被模拟成了一个类似双核心 CPU 的功能。 From eb1ab31f196012739e760578afdb906e31a18248 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 15:02:04 +0800 Subject: [PATCH 009/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySQL-5.6/1G-Memory-Machine/my.cnf | 172 ++++++++++++++++++ Mysql-Install-And-Settings.md | 40 ++-- 2 files changed, 193 insertions(+), 19 deletions(-) create mode 100644 MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf diff --git a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf new file mode 100644 index 00000000..27cd16c4 --- /dev/null +++ b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf @@ -0,0 +1,172 @@ + +# 适用于 Mysql 5.6 +# 该配置适合 1G 内存左右的机子,储存类型为 InnoDB +# 官网配置说明:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html +# 官网状态值说明:http://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html +# 在线生成配置工具:http://tools.percona.com(只是起到一个参考作用,生成的配置文件里面的参数名有的是用符号:-,而官网是用:_,所以这个也要注意改掉。) +# 资料参考:https://blog.linuxeye.com/379.html +# 注释内容为注释行下面的配置的解释 + +# ============================================================================================================ + + +[client] +port = 3306 +socket = /usr/program/mysql/data/mysql.sock +default-character-set = utf8 + + +[mysql] +port = 3306 +socket = /usr/program/mysql/data/mysql.sock +default-character-set = utf8 + +# ============================================================================================================ + + +[mysqld] +user = mysql +port = 3306 +default-storage-engine = InnoDB +socket = /usr/program/mysql/data/mysql.sock +collation-server = utf8_unicode_ci +init_connect='SET NAMES utf8' +character-set-server = utf8 +basedir = /usr/program/mysql +datadir = /usr/program/mysql/data +pid-file = /usr/program/mysql/data/mysql.pid +log-error = /usr/program/mysql/data/mysql-error.log + +# 表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 +server-id = 1 + +# back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。 +# 另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。 +back_log = 512 + +# MySQL的最大并发连接数 +max_connections = 1000 +# 网络传输中一次小心传输量的最大值(最大值为1G);增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 +max_allowed_packet = 4M +# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行 Mysql 命令:FLUSH HOST。 +max_connect_errors = 6000 +# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 +skip_name_resolve +# MySQL打开的文件描述符限制 +open_files_limit = 65535 +# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值 400,最大值:524288。假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 +table_open_cache = 400 + +# 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K +binlog_cache_size = 1M +# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变 +max_heap_table_size = 8M +# MySQL的heap(堆积)表缓冲大小。如果超过该值,则会将临时表写入磁盘。其范围值:1KB~4GB +tmp_table_size = 128M + +# MySQL读入缓冲区大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +read_buffer_size = 2M +# MySQL的随机读缓冲区大小。 +read_rnd_buffer_size = 8M +# MySQL执行排序使用的缓冲大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +sort_buffer_size = 2M +# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X4M=400M,所以4G内存的服务器,建议该值是6~8M +join_buffer_size = 4M +# 指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),对于4GB内存的服务器,该参数可以设置为:256M或384M +key_buffer_size = 64M +# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中, +# 根据物理内存设置规则如下: +# 1G —> 8 +# 2G —> 16 +# 3G —> 32 +# 大于3G —> 64 +thread_cache_size = 8 + +# 每个线程的堆栈大小,值范围:128K ~ 4GB,默认是192KB +thread_stack = 256k + +# 0是关闭高速缓存,1是开启高速缓存 +query_cache_type = 1 +# 查询缓冲区的大小,如果是4G内存建议设置为64M。具体设置值还要根据运行环境来判断,你可以执行这个SQL语句:show status like 'Qcache%'; +# 从SQL语句查询的结果中,查看Qcache_lowmem_prunes的值非常大表示查询缓冲不够,你应该增加该设置值 +query_cache_size = 8M +query_cache_limit = 2M + +# 分词词汇最小长度,默认4 +ft_min_word_len = 4 + +log-bin = /usr/program/mysql/data/mysql-bin +binlog_format = mixed +expire_logs_days = 30 + +# 是否开启慢查询记录,1表示开启,0表示关闭,如果是主从环境下,主库不要开启,从库开启 +slow_query_log = 1 +# 慢查询时间 超过3秒则为慢查询 +long_query_time = 3 +slow_query_log_file = /usr/program/mysql/data/mysql-slow.log + +performance_schema = 0 +explicit_defaults_for_timestamp + +# 数据库库名/表名是否区分大小写,0:区分大小写,1:不区分大小写 +lower_case_table_names = 1 + +# MySQL选项以避免外部锁定,减少出错几率,增强稳定性 +skip_external_locking + + +# 在网络上不允许TCP/IP连接到MySQL。所有到MySQL的连接必须经由Unix socket进行。如果要允许TCP/IP连接,则注释当前行即可 +skip-networking + + +# 该设置值取值为:服务器机子的逻辑CPU数量X2,比如你的服务器机子是 Linux 系统你可以执行:grep 'processor' /proc/cpuinfo | sort -u | wc -l,可以查看到逻辑CPU数量值,比如我取到的值是24,那我这里应该设置为:24X2=48 +thread_concurrency = 2 + +innodb_file_per_table = 1 +# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300 +innodb_open_files = 500 +# InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM. +# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. +# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的70%左右 +# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. +innodb_buffer_pool_size = 64M + +# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4 +# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 +innodb_write_io_threads = 4 +innodb_read_io_threads = 4 + +# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量 +innodb_thread_concurrency = 0 +innodb_purge_threads = 1 +innodb_flush_log_at_trx_commit = 2 +innodb_log_buffer_size = 2M +innodb_log_file_size = 32M +innodb_log_files_in_group = 3 +innodb_max_dirty_pages_pct = 90 +innodb_lock_wait_timeout = 120 +innodb_additional_mem_pool_size = 2M + +bulk_insert_buffer_size = 8M +# 用于设置在 REPAIR TABLE 和 CREATE INDEX 创建索引或 ALTER TABLE 的过程中排序索引所分配的缓冲区大小,可设置范围:4MB~4GB,默认8MB,4G内存的服务器可以设置为32M~64M +myisam_sort_buffer_size = 8M +myisam_max_sort_file_size = 10G +myisam_repair_threads = 1 + +# 服务器关闭交互式连接前等待活动的秒数。单位秒 +interactive_timeout = 28800 +# 服务器关闭非交互连接之前等待活动的秒数。单位秒。通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大。默认值:28800 +wait_timeout = 3600 + +# ============================================================================================================ + +[mysqldump] +quick +# 服务器发送和接受的最大包长度 +max_allowed_packet = 16M + +[myisamchk] +key_buffer_size = 8M +sort_buffer_size = 8M +read_buffer = 4M +write_buffer = 4M diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 5046e062..b26e0ab0 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -76,7 +76,7 @@ /usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf ``` - 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 - + - 我整理的一个单机版配置说明:[my.cnf](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf) ## MySQL 主从复制 @@ -104,6 +104,7 @@ - 主 DB 开启二进制日志功能:`vim /etc/my.cnf`, - 添加一行:`log-bin = /usr/program/mysql/data/mysql-bin` - 指定同步的数据库,如果不指定则同步全部数据库,其中 ssm 是我的数据库名:`binlog-do-db=ssm` + - 主库关掉慢查询记录,用 SQL 语句查看当前是否开启:`SHOW VARIABLES LIKE '%slow_query_log%';`,如果显示 OFF 则表示关闭,ON 表示开启 - 重启主库 MySQL 服务 - 进入 MySQL 命令行状态,执行 SQL 语句查询状态:`SHOW MASTER STATUS;` - 在显示的结果中,我们需要记录下 **File** 和 **Position** 值,等下从库配置有用。 @@ -119,24 +120,25 @@ - 从库操作步骤 -- 测试从库机子是否能连上主库机子:`sudo mysql -h 192.168.1.105 -u slave01 -p`,必须要连上下面的操作才有意义。 - - 由于不能排除是不是系统防火墙的问题,所以建议连不上临时关掉防火墙:`service iptables stop` - - 或是添加防火墙规则: - - 添加规则:`sudo iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT` - - 保存规则:`sudo service iptables save` - - 重启 iptables:`sudo service iptables restart` -- 修改配置文件:`vim /etc/my.cnf`,把 server-id 改为跟主库不一样 -- 在进入 MySQL 的命令行状态下,输入下面 SQL: - -``` SQL -CHANGE MASTER TO -master_host='192.168.1.113', -master_user='slave01', -master_password='123456', -master_port=3306, -master_log_file='mysql3306-bin.000006',>>>这个值复制刚刚让你记录的值 -master_log_pos=1120;>>>这个值复制刚刚让你记录的值 -``` + - 从库开启慢查询记录,用 SQL 语句查看当前是否开启:`SHOW VARIABLES LIKE '%slow_query_log%';`,如果显示 OFF 则表示关闭,ON 表示开启。 + - 测试从库机子是否能连上主库机子:`sudo mysql -h 192.168.1.105 -u slave01 -p`,必须要连上下面的操作才有意义。 + - 由于不能排除是不是系统防火墙的问题,所以建议连不上临时关掉防火墙:`service iptables stop` + - 或是添加防火墙规则: + - 添加规则:`sudo iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT` + - 保存规则:`sudo service iptables save` + - 重启 iptables:`sudo service iptables restart` + - 修改配置文件:`vim /etc/my.cnf`,把 server-id 改为跟主库不一样 + - 在进入 MySQL 的命令行状态下,输入下面 SQL: + + ``` SQL + CHANGE MASTER TO + master_host='192.168.1.113', + master_user='slave01', + master_password='123456', + master_port=3306, + master_log_file='mysql3306-bin.000006',>>>这个值复制刚刚让你记录的值 + master_log_pos=1120;>>>这个值复制刚刚让你记录的值 + ``` - 执行该 SQL 语句,启动 slave 同步:`START SLAVE;` - 执行该 SQL 语句,查看从库机子同步状态:`SHOW SLAVE STATUS;` From b1cc38f0f400ffc70bfab84079aaa07810a4cc6b Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 15:17:21 +0800 Subject: [PATCH 010/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySQL-5.6/1G-Memory-Machine/my.md | 176 ++++++++++++++++++ Mysql-Install-And-Settings.md | 4 +- 2 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md diff --git a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md new file mode 100644 index 00000000..a2ac69da --- /dev/null +++ b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md @@ -0,0 +1,176 @@ +# Mysql 单机版配置 + + +``` nginx +# 适用于 Mysql 5.6 +# 该配置适合 1G 内存左右的机子,储存类型为 InnoDB +# 官网配置说明:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html +# 官网状态值说明:http://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html +# 在线生成配置工具:http://tools.percona.com(只是起到一个参考作用,生成的配置文件里面的参数名有的是用符号:-,而官网是用:_,所以这个也要注意改掉。) +# 资料参考:https://blog.linuxeye.com/379.html +# 注释内容为注释行下面的配置的解释 + +# ============================================================================================================ + + +[client] +port = 3306 +socket = /usr/program/mysql/data/mysql.sock +default-character-set = utf8 + + +[mysql] +port = 3306 +socket = /usr/program/mysql/data/mysql.sock +default-character-set = utf8 + +# ============================================================================================================ + + +[mysqld] +user = mysql +port = 3306 +default-storage-engine = InnoDB +socket = /usr/program/mysql/data/mysql.sock +collation-server = utf8_unicode_ci +init_connect='SET NAMES utf8' +character-set-server = utf8 +basedir = /usr/program/mysql +datadir = /usr/program/mysql/data +pid-file = /usr/program/mysql/data/mysql.pid +log-error = /usr/program/mysql/data/mysql-error.log + +# 表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 +server-id = 1 + +# back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。 +# 另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。 +back_log = 512 + +# MySQL的最大并发连接数 +max_connections = 1000 +# 网络传输中一次小心传输量的最大值(最大值为1G);增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 +max_allowed_packet = 4M +# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行 Mysql 命令:FLUSH HOST。 +max_connect_errors = 6000 +# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 +skip_name_resolve +# MySQL打开的文件描述符限制 +open_files_limit = 65535 +# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值 400,最大值:524288。假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 +table_open_cache = 400 + +# 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K +binlog_cache_size = 1M +# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变 +max_heap_table_size = 8M +# MySQL的heap(堆积)表缓冲大小。如果超过该值,则会将临时表写入磁盘。其范围值:1KB~4GB +tmp_table_size = 128M + +# MySQL读入缓冲区大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +read_buffer_size = 2M +# MySQL的随机读缓冲区大小。 +read_rnd_buffer_size = 8M +# MySQL执行排序使用的缓冲大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +sort_buffer_size = 2M +# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X4M=400M,所以4G内存的服务器,建议该值是6~8M +join_buffer_size = 4M +# 指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),对于4GB内存的服务器,该参数可以设置为:256M或384M +key_buffer_size = 64M +# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中, +# 根据物理内存设置规则如下: +# 1G —> 8 +# 2G —> 16 +# 3G —> 32 +# 大于3G —> 64 +thread_cache_size = 8 + +# 每个线程的堆栈大小,值范围:128K ~ 4GB,默认是192KB +thread_stack = 256k + +# 0是关闭高速缓存,1是开启高速缓存 +query_cache_type = 1 +# 查询缓冲区的大小,如果是4G内存建议设置为64M。具体设置值还要根据运行环境来判断,你可以执行这个SQL语句:show status like 'Qcache%'; +# 从SQL语句查询的结果中,查看Qcache_lowmem_prunes的值非常大表示查询缓冲不够,你应该增加该设置值 +query_cache_size = 8M +query_cache_limit = 2M + +# 分词词汇最小长度,默认4 +ft_min_word_len = 4 + +log-bin = /usr/program/mysql/data/mysql-bin +binlog_format = mixed +expire_logs_days = 30 + +# 是否开启慢查询记录,1表示开启,0表示关闭,如果是主从环境下,主库不要开启,从库开启 +slow_query_log = 1 +# 慢查询时间 超过3秒则为慢查询 +long_query_time = 3 +slow_query_log_file = /usr/program/mysql/data/mysql-slow.log + +performance_schema = 0 +explicit_defaults_for_timestamp + +# 数据库库名/表名是否区分大小写,0:区分大小写,1:不区分大小写 +lower_case_table_names = 1 + +# MySQL选项以避免外部锁定,减少出错几率,增强稳定性 +skip_external_locking + + +# 在网络上不允许TCP/IP连接到MySQL。所有到MySQL的连接必须经由Unix socket进行。如果要允许TCP/IP连接,则注释当前行即可 +skip-networking + + +# 该设置值取值为:服务器机子的逻辑CPU数量X2,比如你的服务器机子是 Linux 系统你可以执行:grep 'processor' /proc/cpuinfo | sort -u | wc -l,可以查看到逻辑CPU数量值,比如我取到的值是24,那我这里应该设置为:24X2=48 +thread_concurrency = 2 + +innodb_file_per_table = 1 +# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300 +innodb_open_files = 500 +# InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM. +# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. +# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的70%左右 +# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. +innodb_buffer_pool_size = 64M + +# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4 +# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 +innodb_write_io_threads = 4 +innodb_read_io_threads = 4 + +# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量 +innodb_thread_concurrency = 0 +innodb_purge_threads = 1 +innodb_flush_log_at_trx_commit = 2 +innodb_log_buffer_size = 2M +innodb_log_file_size = 32M +innodb_log_files_in_group = 3 +innodb_max_dirty_pages_pct = 90 +innodb_lock_wait_timeout = 120 +innodb_additional_mem_pool_size = 2M + +bulk_insert_buffer_size = 8M +# 用于设置在 REPAIR TABLE 和 CREATE INDEX 创建索引或 ALTER TABLE 的过程中排序索引所分配的缓冲区大小,可设置范围:4MB~4GB,默认8MB,4G内存的服务器可以设置为32M~64M +myisam_sort_buffer_size = 8M +myisam_max_sort_file_size = 10G +myisam_repair_threads = 1 + +# 服务器关闭交互式连接前等待活动的秒数。单位秒 +interactive_timeout = 28800 +# 服务器关闭非交互连接之前等待活动的秒数。单位秒。通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大。默认值:28800 +wait_timeout = 3600 + +# ============================================================================================================ + +[mysqldump] +quick +# 服务器发送和接受的最大包长度 +max_allowed_packet = 16M + +[myisamchk] +key_buffer_size = 8M +sort_buffer_size = 8M +read_buffer = 4M +write_buffer = 4M +``` \ No newline at end of file diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index b26e0ab0..aacf6dac 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -76,7 +76,9 @@ /usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf ``` - 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 - - 我整理的一个单机版配置说明:[my.cnf](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf) + - 我整理的一个单机版配置说明: + - [my.cnf 查看版本](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md) + - [my.cnf 下载版本](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf) ## MySQL 主从复制 From e3f3fc6c80b4cf621a786b8b3b1485ad08b18b72 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 15:18:45 +0800 Subject: [PATCH 011/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index aacf6dac..5f74f367 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -76,7 +76,7 @@ /usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf ``` - 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 - - 我整理的一个单机版配置说明: + - 我整理的一个单机版配置说明(MySQL 5.6,适用于 1G 内存的服务器): - [my.cnf 查看版本](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md) - [my.cnf 下载版本](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf) From 32b35d44cc2820941676e33fdbf75c7f8694b786 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 15:22:30 +0800 Subject: [PATCH 012/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 5f74f367..4466de58 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -148,8 +148,8 @@ - `Slave_IO_Running:Yes` - 如果不是 Yes 也不是 No,而是 Connecting,那就表示从机连不上主库,需要你进一步排查连接问题。 - `Slave_SQL_Running:Yes` -- 如果你的 Slave_IO_Running 是 No, 那你可以检查从库下的错误日志:`cat /usr/program/mysql/data/mysql-error.log` - - 如果里面提示 uuid 错误,你可以编辑从库的这个配置文件:`vim /usr/program/mysql/data/auto.cnf`,把配置文件中的:server-uuid 值随便改一下,保证和主库是不一样的。 +- 如果你的 Slave_IO_Running 是 No,一般如果你是在虚拟机上测试的话,从库的虚拟机是从主库的虚拟机上复制过来的,那一般都会这样的,因为两台的 MySQL 的 UUID 值一样。你可以检查从库下的错误日志:`cat /usr/program/mysql/data/mysql-error.log` + - 如果里面提示 uuid 错误,你可以编辑从库的这个配置文件:`vim /usr/program/mysql/data/auto.cnf`,把配置文件中的:server-uuid 值随便改一下,保证和主库是不一样即可。 From b6304dbbe2ee6ab0423b053ff2e85030bf26c8e6 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 22:46:38 +0800 Subject: [PATCH 013/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84NTP?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NTP.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NTP.md b/NTP.md index ee60ae58..4ce9bb55 100644 --- a/NTP.md +++ b/NTP.md @@ -21,6 +21,12 @@ - 该配置解释: - 标注 1 是默认内容,我们这里进行了注释。 - 标注 2 是新增内容,表示使用中国时间校对服务器节点地址。 + ``` nginx + server 0.asia.pool.ntp.org + server 1.asia.pool.ntp.org + server 2.asia.pool.ntp.org + server 3.asia.pool.ntp.org + ``` - 启动服务: - `sudo service ntpd start` - 服务加到启动项 From 299d2094f1f41df32439f8aac2a5f10eb6499c89 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 22:47:37 +0800 Subject: [PATCH 014/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Tutorial.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Mysql-Tutorial.md diff --git a/Mysql-Tutorial.md b/Mysql-Tutorial.md new file mode 100644 index 00000000..cb5a0071 --- /dev/null +++ b/Mysql-Tutorial.md @@ -0,0 +1,15 @@ +# Mysql 教程 + + +## Mysql 常用命令 + + + +## 资料 + +- [MySQL Tutorial-1](http://www.tutorialspoint.com/mysql/) +- [MySQL Tutorial-2](http://www.mysqltutorial.org/) +- [MySQL Tutorial-3](http://zetcode.com/databases/mysqltutorial/) +- [MySQL 教程-1](http://www.runoob.com/mysql/mysql-connection.html) +- [MySQL 教程-2](http://www.w3school.com.cn/sql/) +- [MySQL 教程-3](https://wizardforcel.gitbooks.io/w3school-sql/content/part7.html) From c843292ab19cffd6ef38b69dfa28ba53580b5cf3 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 17 Apr 2016 22:48:22 +0800 Subject: [PATCH 015/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7964707c..e0d68c5e 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ - [Maven 安装和配置](Maven-Install-And-Settings.md) - [Nexus 安装和配置](Nexus-Install-And-Settings.md) - [MySQL 安装和配置](Mysql-Install-And-Settings.md) +- [MySQL 教程](Mysql-Tutorial.md) - [Redis 安装和配置](Redis-Install-And-Settings.md) - [Solr 安装和配置](Solr-Install-And-Settings.md) - [Jira 安装和配置](Jira-Install-And-Settings.md) From 38de29a62705d3884f1a28ca192d3bf1cf8faeaf Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 24 Apr 2016 12:04:55 +0800 Subject: [PATCH 016/730] =?UTF-8?q?2016-04-24MySQL=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1G-Memory-Machine/my-for-master.cnf | 181 ++++++++++++++++++ .../1G-Memory-Machine/my-for-salve.cnf | 181 ++++++++++++++++++ 2 files changed, 362 insertions(+) create mode 100644 MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-master.cnf create mode 100644 MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf diff --git a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-master.cnf b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-master.cnf new file mode 100644 index 00000000..a91586b3 --- /dev/null +++ b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-master.cnf @@ -0,0 +1,181 @@ + +# 适用于 Mysql 5.6 +# 该配置适合 1G 内存左右的机子,储存类型为 InnoDB +# 官网配置说明:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html +# 官网状态值说明:http://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html +# 官网环境变量说明:http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html +# 在线生成配置工具:http://tools.percona.com(只是起到一个参考作用,生成的配置文件里面的参数名有的是用符号:-,而官网是用:_,所以这个也要注意改掉。) +# 资料参考:https://blog.linuxeye.com/379.html +# 注释内容为注释行下面的配置的解释 +# 这是一个综合配置,不是单独为主库或是从库考虑 + +# ============================================================================================================ + + +# 客户端设置 +[mysql] +port = 3306 +socket = /usr/program/mysql/data/mysql.sock +default-character-set = utf8 + +# ============================================================================================================ + + +# 服务端设置 +[mysqld] +user = mysql +port = 3306 +default-storage-engine = InnoDB +socket = /usr/program/mysql/data/mysql.sock +pid-file = /usr/program/mysql/data/mysql.pid + +collation-server = utf8_unicode_ci +init_connect = 'SET NAMES utf8' +character-set-server = utf8 +basedir = /usr/program/mysql +datadir = /usr/program/mysql/data +log-error = /usr/program/mysql/data/mysql-error.log + +# (重点修改)表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 +server-id = 1 + + + +# back_log 值指出在 MySQL 暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果 MySQL 的连接数据达到 max_connections 时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即 back_log,如果等待连接的数量超过 back_log,将不被授予连接资源。 +# 另外,这值(back_log)限于您的操作系统对到来的 TCP/IP 连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的 OS 文档找出这个变量的最大值),试图设定 back_log 高于你的操作系统的限制将是无效的。 +back_log = 512 + +# MySQL 的最大并发连接数 +max_connections = 1000 +# 网络传输中一次小心传输量的最大值(最大值为 1G);增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或 MySQL 必须返回大的结果行时 MySQL 才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 +max_allowed_packet = 16M +# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行 Mysql 命令:FLUSH HOST。 +max_connect_errors = 1000000 +# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 +skip-name-resolve +# MySQL打开的文件描述符限制 +open_files_limit = 65535 +# MySQL 每打开一个表,都会读入一些数据到 table_open_cache 缓存中,当 MySQL 在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值 400,最大值:524288。假定系统有 200 个并发连接,则需将此参数设置为 200*N (N 为每个连接所需的文件描述符数目);当把 table_open_cache 设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 +table_open_cache = 2048 + +# 一个事务,在没有提交的时候,产生的日志,记录到 Cache 中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认 binlog_cache_size 大小32K +binlog_cache_size = 1M +# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变 +max_heap_table_size = 32M +# MySQL的heap(堆积)表缓冲大小。如果超过该值,则会将临时表写入磁盘。其范围值:1KB~4GB +tmp_table_size = 32M + +# MySQL读入缓冲区大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +read_buffer_size = 2M +# MySQL的随机读缓冲区大小。 +read_rnd_buffer_size = 8M +# MySQL执行排序使用的缓冲大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +sort_buffer_size = 2M +# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X4M=400M,所以4G内存的服务器,建议该值是6~8M +join_buffer_size = 4M +# 指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),对于4GB内存的服务器,该参数可以设置为:256M或384M +key_buffer_size = 64M +# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中, +# 根据物理内存设置规则如下: +# 1G —> 8 +# 2G —> 16 +# 3G —> 32 +# 大于3G —> 64 +thread_cache_size = 8 + +# 每个线程的堆栈大小,值范围:128K ~ 4GB,默认是192KB +thread_stack = 256k + +# 0是关闭高速缓存,1是开启高速缓存 +query_cache_type = 0 +# 查询缓冲区的大小,如果是4G内存建议设置为64M。具体设置值还要根据运行环境来判断,你可以执行这个SQL语句:show status like 'Qcache%'; +# 从SQL语句查询的结果中,查看Qcache_lowmem_prunes的值非常大表示查询缓冲不够,你应该增加该设置值 +query_cache_size = 0 +query_cache_limit = 2M + +# 分词词汇最小长度,默认4 +ft_min_word_len = 4 + +log-bin = /usr/program/mysql/data/mysql-bin +binlog-format = mixed +expire_logs_days = 30 +# 该参数的说明:http://blog.csdn.net/wulantian/article/details/9965905 +sync_binlog = 1 + +# 是否开启慢查询记录,1表示开启,0表示关闭,如果是主从环境下,主库不要开启,从库开启 +slow_query_log = 0 +# 慢查询时间 超过3秒则为慢查询 +long_query_time = 3 +slow_query_log_file = /usr/program/mysql/data/mysql-slow.log + +performance_schema = 0 +# 改参数的说明:http://www.cnblogs.com/digdeep/p/4727715.html +explicit_defaults_for_timestamp = true + +# 数据库库名/表名是否区分大小写,0:区分大小写,1:不区分大小写 +lower_case_table_names = 1 + +# MySQL选项以避免外部锁定,减少出错几率,增强稳定性 +skip_external_locking + + +# 在网络上不允许TCP/IP连接到MySQL。所有到MySQL的连接必须经由Unix socket进行。如果要允许TCP/IP连接,则注释当前行即可 +# skip-networking + + +table_definition_cache = 1024 + +# 该设置值取值为:服务器机子的逻辑CPU数量X2,比如你的服务器机子是 Linux 系统你可以执行:grep 'processor' /proc/cpuinfo | sort -u | wc -l,可以查看到逻辑CPU数量值,比如我取到的值是24,那我这里应该设置为:24X2=48 +thread_concurrency = 2 + +# 强制为 innodb类型 +innodb = FORCE +innodb_file_per_table = 1 +# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300 +innodb_open_files = 500 +# InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM. +# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. +# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的70%左右 +# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. +innodb_buffer_pool_size = 592M + +# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4 +# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 +innodb_write_io_threads = 4 +innodb_read_io_threads = 4 + +# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量 +innodb_thread_concurrency = 0 +innodb_purge_threads = 1 +innodb_flush_log_at_trx_commit = 1 +innodb_log_buffer_size = 2M +innodb_log_file_size = 64M +innodb_log_files_in_group = 3 +innodb_max_dirty_pages_pct = 90 +innodb_lock_wait_timeout = 120 +innodb_additional_mem_pool_size = 2M +innodb_flush_method = O_DIRECT +bulk_insert_buffer_size = 8M +# 用于设置在 REPAIR TABLE 和 CREATE INDEX 创建索引或 ALTER TABLE 的过程中排序索引所分配的缓冲区大小,可设置范围:4MB~4GB,默认8MB,4G内存的服务器可以设置为32M~64M +myisam_sort_buffer_size = 8M +# 32位系统默认值是2147483648=2G,64位系统,默认值是9223372036854775807,单位是bytes. +myisam_max_sort_file_size = 2147483648 +myisam_repair_threads = 1 + +# 服务器关闭交互式连接前等待活动的秒数。单位秒 +interactive_timeout = 28800 +# 服务器关闭非交互连接之前等待活动的秒数。单位秒。通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大。默认值:28800 +wait_timeout = 3600 + +# ============================================================================================================ + +[mysqldump] +quick +# 服务器发送和接受的最大包长度 +max_allowed_packet = 16M + +[myisamchk] +key_buffer_size = 8M +sort_buffer_size = 8M +read_buffer = 4M +write_buffer = 4M diff --git a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf new file mode 100644 index 00000000..4ac82433 --- /dev/null +++ b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf @@ -0,0 +1,181 @@ + +# 适用于 Mysql 5.6 +# 该配置适合 1G 内存左右的机子,储存类型为 InnoDB +# 官网配置说明:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html +# 官网状态值说明:http://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html +# 官网环境变量说明:http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html +# 在线生成配置工具:http://tools.percona.com(只是起到一个参考作用,生成的配置文件里面的参数名有的是用符号:-,而官网是用:_,所以这个也要注意改掉。) +# 资料参考:https://blog.linuxeye.com/379.html +# 注释内容为注释行下面的配置的解释 +# 这是一个综合配置,不是单独为主库或是从库考虑 + +# ============================================================================================================ + + +# 客户端设置 +[mysql] +port = 3306 +socket = /usr/program/mysql/data/mysql.sock +default-character-set = utf8 + +# ============================================================================================================ + + +# 服务端设置 +[mysqld] +user = mysql +port = 3306 +default-storage-engine = InnoDB +socket = /usr/program/mysql/data/mysql.sock +pid-file = /usr/program/mysql/data/mysql.pid + +collation-server = utf8_unicode_ci +init_connect = 'SET NAMES utf8' +character-set-server = utf8 +basedir = /usr/program/mysql +datadir = /usr/program/mysql/data +log-error = /usr/program/mysql/data/mysql-error.log + +# (重点修改)表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 +server-id = 1 + + + +# back_log 值指出在 MySQL 暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果 MySQL 的连接数据达到 max_connections 时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即 back_log,如果等待连接的数量超过 back_log,将不被授予连接资源。 +# 另外,这值(back_log)限于您的操作系统对到来的 TCP/IP 连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的 OS 文档找出这个变量的最大值),试图设定 back_log 高于你的操作系统的限制将是无效的。 +back_log = 512 + +# MySQL 的最大并发连接数 +max_connections = 1000 +# 网络传输中一次小心传输量的最大值(最大值为 1G);增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或 MySQL 必须返回大的结果行时 MySQL 才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 +max_allowed_packet = 16M +# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行 Mysql 命令:FLUSH HOST。 +max_connect_errors = 1000000 +# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 +skip-name-resolve +# MySQL打开的文件描述符限制 +open_files_limit = 65535 +# MySQL 每打开一个表,都会读入一些数据到 table_open_cache 缓存中,当 MySQL 在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值 400,最大值:524288。假定系统有 200 个并发连接,则需将此参数设置为 200*N (N 为每个连接所需的文件描述符数目);当把 table_open_cache 设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 +table_open_cache = 2048 + +# 一个事务,在没有提交的时候,产生的日志,记录到 Cache 中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认 binlog_cache_size 大小32K +binlog_cache_size = 1M +# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变 +max_heap_table_size = 32M +# MySQL的heap(堆积)表缓冲大小。如果超过该值,则会将临时表写入磁盘。其范围值:1KB~4GB +tmp_table_size = 32M + +# MySQL读入缓冲区大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +read_buffer_size = 2M +# MySQL的随机读缓冲区大小。 +read_rnd_buffer_size = 8M +# MySQL执行排序使用的缓冲大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M +sort_buffer_size = 2M +# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X4M=400M,所以4G内存的服务器,建议该值是6~8M +join_buffer_size = 4M +# 指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),对于4GB内存的服务器,该参数可以设置为:256M或384M +key_buffer_size = 64M +# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中, +# 根据物理内存设置规则如下: +# 1G —> 8 +# 2G —> 16 +# 3G —> 32 +# 大于3G —> 64 +thread_cache_size = 8 + +# 每个线程的堆栈大小,值范围:128K ~ 4GB,默认是192KB +thread_stack = 256k + +# 0是关闭高速缓存,1是开启高速缓存 +query_cache_type = 1 +# 查询缓冲区的大小,如果是4G内存建议设置为64M。具体设置值还要根据运行环境来判断,你可以执行这个SQL语句:show status like 'Qcache%'; +# 从SQL语句查询的结果中,查看Qcache_lowmem_prunes的值非常大表示查询缓冲不够,你应该增加该设置值 +query_cache_size = 8M +query_cache_limit = 2M + +# 分词词汇最小长度,默认4 +ft_min_word_len = 4 + +log-bin = /usr/program/mysql/data/mysql-bin +binlog-format = mixed +expire_logs_days = 30 +# 该参数的说明:http://blog.csdn.net/wulantian/article/details/9965905 +sync_binlog = 0 + +# 是否开启慢查询记录,1表示开启,0表示关闭,如果是主从环境下,主库不要开启,从库开启 +slow_query_log = 1 +# 慢查询时间 超过3秒则为慢查询 +long_query_time = 3 +slow_query_log_file = /usr/program/mysql/data/mysql-slow.log + +performance_schema = 0 +# 改参数的说明:http://www.cnblogs.com/digdeep/p/4727715.html +explicit_defaults_for_timestamp = true + +# 数据库库名/表名是否区分大小写,0:区分大小写,1:不区分大小写 +lower_case_table_names = 1 + +# MySQL选项以避免外部锁定,减少出错几率,增强稳定性 +skip_external_locking + + +# 在网络上不允许TCP/IP连接到MySQL。所有到MySQL的连接必须经由Unix socket进行。如果要允许TCP/IP连接,则注释当前行即可 +# skip-networking + + +table_definition_cache = 1024 + +# 该设置值取值为:服务器机子的逻辑CPU数量X2,比如你的服务器机子是 Linux 系统你可以执行:grep 'processor' /proc/cpuinfo | sort -u | wc -l,可以查看到逻辑CPU数量值,比如我取到的值是24,那我这里应该设置为:24X2=48 +thread_concurrency = 2 + +# 强制为 innodb类型 +innodb = FORCE +innodb_file_per_table = 1 +# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300 +innodb_open_files = 500 +# InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM. +# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. +# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的70%左右 +# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. +innodb_buffer_pool_size = 592M + +# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4 +# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 +innodb_write_io_threads = 4 +innodb_read_io_threads = 4 + +# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量 +innodb_thread_concurrency = 0 +innodb_purge_threads = 1 +innodb_flush_log_at_trx_commit = 1 +innodb_log_buffer_size = 2M +innodb_log_file_size = 64M +innodb_log_files_in_group = 3 +innodb_max_dirty_pages_pct = 90 +innodb_lock_wait_timeout = 120 +innodb_additional_mem_pool_size = 2M +innodb_flush_method = O_DIRECT +bulk_insert_buffer_size = 8M +# 用于设置在 REPAIR TABLE 和 CREATE INDEX 创建索引或 ALTER TABLE 的过程中排序索引所分配的缓冲区大小,可设置范围:4MB~4GB,默认8MB,4G内存的服务器可以设置为32M~64M +myisam_sort_buffer_size = 8M +# 32位系统默认值是2147483648=2G,64位系统,默认值是9223372036854775807,单位是bytes. +myisam_max_sort_file_size = 2147483648 +myisam_repair_threads = 1 + +# 服务器关闭交互式连接前等待活动的秒数。单位秒 +interactive_timeout = 28800 +# 服务器关闭非交互连接之前等待活动的秒数。单位秒。通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大。默认值:28800 +wait_timeout = 3600 + +# ============================================================================================================ + +[mysqldump] +quick +# 服务器发送和接受的最大包长度 +max_allowed_packet = 16M + +[myisamchk] +key_buffer_size = 8M +sort_buffer_size = 8M +read_buffer = 4M +write_buffer = 4M From cbed5aa70d3427849f483403c1bf8a3badce71d0 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 24 Apr 2016 12:07:48 +0800 Subject: [PATCH 017/730] =?UTF-8?q?2016-04-24=E5=AE=8C=E5=96=84Tomcat?= =?UTF-8?q?=E7=9A=84=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JDK-Install.md | 5 ++ Tomcat-Install-And-Settings.md | 100 +++++++++++++++++++++++++++++---- 2 files changed, 95 insertions(+), 10 deletions(-) diff --git a/JDK-Install.md b/JDK-Install.md index 004739b8..2c4a1429 100644 --- a/JDK-Install.md +++ b/JDK-Install.md @@ -53,6 +53,8 @@ - 执行命令,刷新该配置(必备操作):`source /etc/profile` - 检查是否使用了最新的 JDK:`java -version` + + ## 其他 - JDK 历史版本下载地址整理(不间断更新): @@ -66,4 +68,7 @@ ## 资料 - + - <> + - <> + - <> \ No newline at end of file diff --git a/Tomcat-Install-And-Settings.md b/Tomcat-Install-And-Settings.md index 8135811c..37676c4f 100644 --- a/Tomcat-Install-And-Settings.md +++ b/Tomcat-Install-And-Settings.md @@ -54,12 +54,50 @@ - 改为:`exec "$PRGDIR"/"$EXECUTABLE" stop 10 -force` -## Tomcat 8 优化 +## Tomcat 7 优化 -- 官网标准答案: -- 官网帮助文档下载(该资料在:`/tomcat-8.0-doc/config/http.html`):`wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32-fulldocs.tar.gz` -- 编辑配置文件:`vim /usr/program/tomcat8/conf/server.xml` - - 修改链接参数: +- Tomcat 6/7/8 的优化参数有点不一样,最好按下面的方式看一下官网这个文档是否还保留着这个参数 +- 启动tomcat,访问该地址,下面要讲解的一些配置信息,在该文档下都有说明的: + - 文档: + - 你也可以直接看网络版本: + - Tomcat 6 文档: + - Tomcat 7 文档: + - Tomcat 8 文档: +- 如果你需要查看 Tomcat 的运行状态可以配置tomcat管理员账户,然后登陆 Tomcat 后台进行查看 +- 编辑 /opt/tomcat7/bin/conf/tomcat-users.xml 文件,在里面添加下面信息: +``` xml + + + + + +``` +- 编辑配置文件:`vim /usr/program/tomcat7/conf/server.xml` + - 打开默认被注释的连接池配置: + - 默认值: + ``` xml + + ``` + - 修改为: + ``` xml + + ``` + - 重点参数解释: + - maxThreads,最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断 + - minSpareThreads,Tomcat 初始化时创建的线程数,默认设置 25 + - prestartminSpareThreads,在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了 + - maxQueueSize,最大的等待队列数,超过则拒绝请求 + - 修改默认的链接参数配置: - 默认值: ``` xml ``` - 重点参数解释: - protocol,Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol - - protocol,Tomcat 6 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol + - protocol,Tomcat 6、7 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol - enableLookups,禁用DNS查询 - acceptCount,指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 - - maxThreads,最大并发数,默认设置 200 - - minSpareThreads,Tomcat初始化时创建的线程数,默认设置 10 + - maxPostSize,以 FORM URL 参数方式的 POST 提交方式,限制提交最大的大小,默认是 2097152(2兆),它使用的单位是字节。10485760 为 10M。如果要禁用限制,则可以设置为 -1。 + - acceptorThreadCount,用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2. + - 禁用 AJP(如果你服务器没有使用 Apache) + - 把下面这一行注释掉,默认 Tomcat 是开启的。 + ``` xml + + ``` + + + +## JVM 优化 + +- 模型资料来源: +- Java 的内存模型分为: + - Young,年轻代(易被 GC)。Young 区被划分为三部分,Eden 区和两个大小严格相同的 Survivor 区,其中 Survivor 区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在 Young 区间变满的时候,minor GC 就会将存活的对象移到空闲的Survivor 区间中,根据 JVM 的策略,在经过几次垃圾收集后,任然存活于 Survivor 的对象将被移动到 Tenured 区间。 + - Tenured,终身代。Tenured 区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在 Young 复制转移一定的次数以后,对象就会被转移到 Tenured 区,一般如果系统中用了 application 级别的缓存,缓存中的对象往往会被转移到这一区间。 + - Perm,永久代。主要保存 class,method,filed 对象,这部门的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到 java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的 class 没有被卸载掉,这样就造成了大量的 class 对象保存在了 perm 中,这种情况下,一般重新启动应用服务器可以解决问题。 +- Linux 修改 /usr/program/tomcat7/bin/catalina.sh 文件,把下面信息添加到文件第一行。Windows 和 Linux 有点不一样的地方在于,在 Linux 下,下面的的参数值是被引号包围的,而 Windows 不需要引号包围。 + - 如果服务器只运行一个 Tomcat + - 机子内存如果是 8G,一般 PermSize 配置是主要保证系统能稳定起来就行: + - JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms6144m -Xmx6144m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC" + - 机子内存如果是 16G,一般 PermSize 配置是主要保证系统能稳定起来就行: + - JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms13312m -Xmx13312m -XX:NewSize=3072m -XX:MaxNewSize=4096m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC" + - 机子内存如果是 32G,一般 PermSize 配置是主要保证系统能稳定起来就行: + - JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms29696m -Xmx29696m -XX:NewSize=6144m -XX:MaxNewSize=9216m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC" + - 如果是开发机 + - -Xms550m -Xmx1250m -XX:PermSize=550m -XX:MaxPermSize=1250m + - 参数说明: + ``` nginx + -Dfile.encoding:默认文件编码 + -server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的 + -Xmx1024m:设置JVM最大可用内存为1024MB + -Xms1024m:设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 + -XX:NewSize:设置年轻代大小 + -XX:MaxNewSize:设置最大的年轻代大小 + -XX:PermSize:设置永久代大小 + -XX:MaxPermSize:设置最大永久代大小 + -XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5 + -XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 + -XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC + ``` ## 其他 From a5d8a389084b0613b426fd54f1473f523d962bcf Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 24 Apr 2016 12:16:09 +0800 Subject: [PATCH 018/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9B=B8=E5=85=B3=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{my.md => my-for-comprehensive.cnf} | 74 ++++---- .../MySQL-5.6/1G-Memory-Machine/my.cnf | 172 ------------------ Mysql-Install-And-Settings.md | 3 +- Mysql-Optimize.md | 120 ++++++++++++ 4 files changed, 162 insertions(+), 207 deletions(-) rename MySQL-Settings/MySQL-5.6/1G-Memory-Machine/{my.md => my-for-comprehensive.cnf} (70%) delete mode 100644 MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf create mode 100644 Mysql-Optimize.md diff --git a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf similarity index 70% rename from MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md rename to MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf index a2ac69da..9b76e74d 100644 --- a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md +++ b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf @@ -1,24 +1,21 @@ -# Mysql 单机版配置 - -``` nginx # 适用于 Mysql 5.6 # 该配置适合 1G 内存左右的机子,储存类型为 InnoDB # 官网配置说明:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html # 官网状态值说明:http://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html +# 官网环境变量说明:http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html # 在线生成配置工具:http://tools.percona.com(只是起到一个参考作用,生成的配置文件里面的参数名有的是用符号:-,而官网是用:_,所以这个也要注意改掉。) # 资料参考:https://blog.linuxeye.com/379.html # 注释内容为注释行下面的配置的解释 +# 这是一个综合配置,不是单独为主库或是从库考虑 +# 如果你需要主、从配置可以看: +# 主的配置可以看:https://github.com/judasn/Linux-Tutorial/blob/master/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-master.cnf +# 从的配置可以看:https://github.com/judasn/Linux-Tutorial/blob/master/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf # ============================================================================================================ -[client] -port = 3306 -socket = /usr/program/mysql/data/mysql.sock -default-character-set = utf8 - - +# 客户端设置 [mysql] port = 3306 socket = /usr/program/mysql/data/mysql.sock @@ -27,45 +24,49 @@ default-character-set = utf8 # ============================================================================================================ +# 服务端设置 [mysqld] user = mysql port = 3306 default-storage-engine = InnoDB socket = /usr/program/mysql/data/mysql.sock +pid-file = /usr/program/mysql/data/mysql.pid + collation-server = utf8_unicode_ci -init_connect='SET NAMES utf8' +init_connect = 'SET NAMES utf8' character-set-server = utf8 basedir = /usr/program/mysql datadir = /usr/program/mysql/data -pid-file = /usr/program/mysql/data/mysql.pid log-error = /usr/program/mysql/data/mysql-error.log -# 表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 +# (重点修改)表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 server-id = 1 -# back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。 -# 另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。 + + +# back_log 值指出在 MySQL 暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果 MySQL 的连接数据达到 max_connections 时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即 back_log,如果等待连接的数量超过 back_log,将不被授予连接资源。 +# 另外,这值(back_log)限于您的操作系统对到来的 TCP/IP 连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的 OS 文档找出这个变量的最大值),试图设定 back_log 高于你的操作系统的限制将是无效的。 back_log = 512 -# MySQL的最大并发连接数 +# MySQL 的最大并发连接数 max_connections = 1000 -# 网络传输中一次小心传输量的最大值(最大值为1G);增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 -max_allowed_packet = 4M +# 网络传输中一次小心传输量的最大值(最大值为 1G);增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或 MySQL 必须返回大的结果行时 MySQL 才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 +max_allowed_packet = 16M # 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行 Mysql 命令:FLUSH HOST。 -max_connect_errors = 6000 +max_connect_errors = 1000000 # 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 -skip_name_resolve +skip-name-resolve # MySQL打开的文件描述符限制 open_files_limit = 65535 -# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值 400,最大值:524288。假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 -table_open_cache = 400 +# MySQL 每打开一个表,都会读入一些数据到 table_open_cache 缓存中,当 MySQL 在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值 400,最大值:524288。假定系统有 200 个并发连接,则需将此参数设置为 200*N (N 为每个连接所需的文件描述符数目);当把 table_open_cache 设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 +table_open_cache = 2048 -# 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K +# 一个事务,在没有提交的时候,产生的日志,记录到 Cache 中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认 binlog_cache_size 大小32K binlog_cache_size = 1M # 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变 -max_heap_table_size = 8M +max_heap_table_size = 32M # MySQL的heap(堆积)表缓冲大小。如果超过该值,则会将临时表写入磁盘。其范围值:1KB~4GB -tmp_table_size = 128M +tmp_table_size = 32M # MySQL读入缓冲区大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M read_buffer_size = 2M @@ -99,8 +100,10 @@ query_cache_limit = 2M ft_min_word_len = 4 log-bin = /usr/program/mysql/data/mysql-bin -binlog_format = mixed +binlog-format = mixed expire_logs_days = 30 +# 该参数的说明:http://blog.csdn.net/wulantian/article/details/9965905 +sync_binlog = 0 # 是否开启慢查询记录,1表示开启,0表示关闭,如果是主从环境下,主库不要开启,从库开启 slow_query_log = 1 @@ -109,7 +112,8 @@ long_query_time = 3 slow_query_log_file = /usr/program/mysql/data/mysql-slow.log performance_schema = 0 -explicit_defaults_for_timestamp +# 改参数的说明:http://www.cnblogs.com/digdeep/p/4727715.html +explicit_defaults_for_timestamp = true # 数据库库名/表名是否区分大小写,0:区分大小写,1:不区分大小写 lower_case_table_names = 1 @@ -119,12 +123,16 @@ skip_external_locking # 在网络上不允许TCP/IP连接到MySQL。所有到MySQL的连接必须经由Unix socket进行。如果要允许TCP/IP连接,则注释当前行即可 -skip-networking +# skip-networking + +table_definition_cache = 1024 # 该设置值取值为:服务器机子的逻辑CPU数量X2,比如你的服务器机子是 Linux 系统你可以执行:grep 'processor' /proc/cpuinfo | sort -u | wc -l,可以查看到逻辑CPU数量值,比如我取到的值是24,那我这里应该设置为:24X2=48 thread_concurrency = 2 +# 强制为 innodb类型 +innodb = FORCE innodb_file_per_table = 1 # 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300 innodb_open_files = 500 @@ -132,7 +140,7 @@ innodb_open_files = 500 # 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. # 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的70%左右 # 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. -innodb_buffer_pool_size = 64M +innodb_buffer_pool_size = 592M # innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4 # 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 @@ -142,18 +150,19 @@ innodb_read_io_threads = 4 # 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量 innodb_thread_concurrency = 0 innodb_purge_threads = 1 -innodb_flush_log_at_trx_commit = 2 +innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 2M -innodb_log_file_size = 32M +innodb_log_file_size = 64M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_additional_mem_pool_size = 2M - +innodb_flush_method = O_DIRECT bulk_insert_buffer_size = 8M # 用于设置在 REPAIR TABLE 和 CREATE INDEX 创建索引或 ALTER TABLE 的过程中排序索引所分配的缓冲区大小,可设置范围:4MB~4GB,默认8MB,4G内存的服务器可以设置为32M~64M myisam_sort_buffer_size = 8M -myisam_max_sort_file_size = 10G +# 32位系统默认值是2147483648=2G,64位系统,默认值是9223372036854775807,单位是bytes. +myisam_max_sort_file_size = 2147483648 myisam_repair_threads = 1 # 服务器关闭交互式连接前等待活动的秒数。单位秒 @@ -173,4 +182,3 @@ key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M -``` \ No newline at end of file diff --git a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf deleted file mode 100644 index 27cd16c4..00000000 --- a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf +++ /dev/null @@ -1,172 +0,0 @@ - -# 适用于 Mysql 5.6 -# 该配置适合 1G 内存左右的机子,储存类型为 InnoDB -# 官网配置说明:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html -# 官网状态值说明:http://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html -# 在线生成配置工具:http://tools.percona.com(只是起到一个参考作用,生成的配置文件里面的参数名有的是用符号:-,而官网是用:_,所以这个也要注意改掉。) -# 资料参考:https://blog.linuxeye.com/379.html -# 注释内容为注释行下面的配置的解释 - -# ============================================================================================================ - - -[client] -port = 3306 -socket = /usr/program/mysql/data/mysql.sock -default-character-set = utf8 - - -[mysql] -port = 3306 -socket = /usr/program/mysql/data/mysql.sock -default-character-set = utf8 - -# ============================================================================================================ - - -[mysqld] -user = mysql -port = 3306 -default-storage-engine = InnoDB -socket = /usr/program/mysql/data/mysql.sock -collation-server = utf8_unicode_ci -init_connect='SET NAMES utf8' -character-set-server = utf8 -basedir = /usr/program/mysql -datadir = /usr/program/mysql/data -pid-file = /usr/program/mysql/data/mysql.pid -log-error = /usr/program/mysql/data/mysql-error.log - -# 表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 -server-id = 1 - -# back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。 -# 另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。 -back_log = 512 - -# MySQL的最大并发连接数 -max_connections = 1000 -# 网络传输中一次小心传输量的最大值(最大值为1G);增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 -max_allowed_packet = 4M -# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行 Mysql 命令:FLUSH HOST。 -max_connect_errors = 6000 -# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 -skip_name_resolve -# MySQL打开的文件描述符限制 -open_files_limit = 65535 -# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值 400,最大值:524288。假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 -table_open_cache = 400 - -# 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K -binlog_cache_size = 1M -# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变 -max_heap_table_size = 8M -# MySQL的heap(堆积)表缓冲大小。如果超过该值,则会将临时表写入磁盘。其范围值:1KB~4GB -tmp_table_size = 128M - -# MySQL读入缓冲区大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M -read_buffer_size = 2M -# MySQL的随机读缓冲区大小。 -read_rnd_buffer_size = 8M -# MySQL执行排序使用的缓冲大小。该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X2M=200M,所以4G内存的服务器,建议该值是6~8M -sort_buffer_size = 2M -# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享,所以,如果有100连接,那占用的内存是:100X4M=400M,所以4G内存的服务器,建议该值是6~8M -join_buffer_size = 4M -# 指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),对于4GB内存的服务器,该参数可以设置为:256M或384M -key_buffer_size = 64M -# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中, -# 根据物理内存设置规则如下: -# 1G —> 8 -# 2G —> 16 -# 3G —> 32 -# 大于3G —> 64 -thread_cache_size = 8 - -# 每个线程的堆栈大小,值范围:128K ~ 4GB,默认是192KB -thread_stack = 256k - -# 0是关闭高速缓存,1是开启高速缓存 -query_cache_type = 1 -# 查询缓冲区的大小,如果是4G内存建议设置为64M。具体设置值还要根据运行环境来判断,你可以执行这个SQL语句:show status like 'Qcache%'; -# 从SQL语句查询的结果中,查看Qcache_lowmem_prunes的值非常大表示查询缓冲不够,你应该增加该设置值 -query_cache_size = 8M -query_cache_limit = 2M - -# 分词词汇最小长度,默认4 -ft_min_word_len = 4 - -log-bin = /usr/program/mysql/data/mysql-bin -binlog_format = mixed -expire_logs_days = 30 - -# 是否开启慢查询记录,1表示开启,0表示关闭,如果是主从环境下,主库不要开启,从库开启 -slow_query_log = 1 -# 慢查询时间 超过3秒则为慢查询 -long_query_time = 3 -slow_query_log_file = /usr/program/mysql/data/mysql-slow.log - -performance_schema = 0 -explicit_defaults_for_timestamp - -# 数据库库名/表名是否区分大小写,0:区分大小写,1:不区分大小写 -lower_case_table_names = 1 - -# MySQL选项以避免外部锁定,减少出错几率,增强稳定性 -skip_external_locking - - -# 在网络上不允许TCP/IP连接到MySQL。所有到MySQL的连接必须经由Unix socket进行。如果要允许TCP/IP连接,则注释当前行即可 -skip-networking - - -# 该设置值取值为:服务器机子的逻辑CPU数量X2,比如你的服务器机子是 Linux 系统你可以执行:grep 'processor' /proc/cpuinfo | sort -u | wc -l,可以查看到逻辑CPU数量值,比如我取到的值是24,那我这里应该设置为:24X2=48 -thread_concurrency = 2 - -innodb_file_per_table = 1 -# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300 -innodb_open_files = 500 -# InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM. -# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. -# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的70%左右 -# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. -innodb_buffer_pool_size = 64M - -# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4 -# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 -innodb_write_io_threads = 4 -innodb_read_io_threads = 4 - -# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量 -innodb_thread_concurrency = 0 -innodb_purge_threads = 1 -innodb_flush_log_at_trx_commit = 2 -innodb_log_buffer_size = 2M -innodb_log_file_size = 32M -innodb_log_files_in_group = 3 -innodb_max_dirty_pages_pct = 90 -innodb_lock_wait_timeout = 120 -innodb_additional_mem_pool_size = 2M - -bulk_insert_buffer_size = 8M -# 用于设置在 REPAIR TABLE 和 CREATE INDEX 创建索引或 ALTER TABLE 的过程中排序索引所分配的缓冲区大小,可设置范围:4MB~4GB,默认8MB,4G内存的服务器可以设置为32M~64M -myisam_sort_buffer_size = 8M -myisam_max_sort_file_size = 10G -myisam_repair_threads = 1 - -# 服务器关闭交互式连接前等待活动的秒数。单位秒 -interactive_timeout = 28800 -# 服务器关闭非交互连接之前等待活动的秒数。单位秒。通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大。默认值:28800 -wait_timeout = 3600 - -# ============================================================================================================ - -[mysqldump] -quick -# 服务器发送和接受的最大包长度 -max_allowed_packet = 16M - -[myisamchk] -key_buffer_size = 8M -sort_buffer_size = 8M -read_buffer = 4M -write_buffer = 4M diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 4466de58..8426e9a8 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -77,8 +77,7 @@ ``` - 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 - 我整理的一个单机版配置说明(MySQL 5.6,适用于 1G 内存的服务器): - - [my.cnf 查看版本](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.md) - - [my.cnf 下载版本](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my.cnf) + - [my.cnf](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf) ## MySQL 主从复制 diff --git a/Mysql-Optimize.md b/Mysql-Optimize.md new file mode 100644 index 00000000..4439542a --- /dev/null +++ b/Mysql-Optimize.md @@ -0,0 +1,120 @@ +# Mysql 优化 + + +- 下面说的优化基于 MySQL 5.6,理论上 5.5 之后的都算试用,具体还是要看官网 + +## 服务状态查询 + +- 查看当前数据库的状态,常用的有: + - 查看当前MySQL中已经记录了多少条慢查询,前提是配置文件中开启慢查询记录了. + - `SHOW STATUS LIKE '%slow_queries%';` + - 查询当前MySQL中查询、更新、删除执行多少条了,可以通过这个来判断系统是侧重于读还是侧重于写,如果是写要考虑使用读写分离。 + - `SHOW STATUS LIKE '%Com_select%';` + - `SHOW STATUS LIKE '%Com_update%';` + - `SHOW STATUS LIKE '%Com_delete%';` + - 显示MySQL服务启动运行了多少时间,如果MySQL服务重启,该时间重新计算,单位秒 + - `SHOW STATUS LIKE 'uptime';` + + + +## 查询优化 + +- 使用 EXPLAIN 进行 SQL 语句分析:`EXPLAIN SELECT * FROM sys_user;` +- 得到的结果有下面几列: + - id,该列表示当前结果序号,无特殊意义,不重要 + - select_type,表示 SELECT 语句的类型,有下面几种 + - SIMPLE,表示简单查询,其中不包括连接查询和子查询 + - PRIMARY,表示主查询,或者是最外面的查询语句。比如你使用一个子查询语句,比如这条 SQL:EXPLAIN SELECT * FROM (SELECT `sys_user_id` FROM `sys_user` WHERE `sys_user_id` = 1) AS temp_table; + - 这条 SQL 有两个结果,其中有一个结果的类型就是 PRIMARY + - UNION,使用 UNION 的SQL是这个类型 + - DERIVED,在 SQL 中 From 后面子查询 + - SUBQUERY,子查询 + - 还有其他一些 + - table,表名或者是子查询的一个结果集 + - type,表示表的链接类型,分别有(以下的连接类型的顺序是从最佳类型到最差类型)**(这个属性重要)**: + - 性能好: + - system,表仅有一行,这是const类型的特列,平时不会出现,这个也可以忽略不计。 + - const,数据表最多只有一个匹配行,因为只匹配一行数据,所以很快,常用于PRIMARY KEY或者UNIQUE索引的查询,可理解为const是最优化的。 + - eq_ref,mysql手册是这样说的:"对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE(唯一键)也不是PRIMARY KEY(主键)"。eq_ref可以用于使用=比较带索引的列。 + - ref,查询条件索引既不是UNIQUE(唯一键)也不是PRIMARY KEY(主键)的情况。ref可用于=或<或>操作符的带索引的列。 + - ref_or_null,该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。 + - 性能较差: + - index_merge,该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。 + - unique_subquery,该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr)。unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。 + - index_subquery,该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr) + - range,只检索给定范围的行,使用一个索引来选择行。 + - index,该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。 + - 性能最差: + - ALL,对于每个来自于先前的表的行组合,进行完整的表扫描。(性能最差) + - possible_keys,指出MySQL能使用哪个索引在该表中找到行。如果该列为NULL,说明没有使用索引,可以对该列创建索引来提供性能。**(这个属性重要)** + - key,显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。**(这个属性重要)** + - key_len,显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。注意:key_len是确定了MySQL将实际使用的索引长度。 + - ref,显示使用哪个列或常数与key一起从表中选择行。 + - rows,显示MySQL认为它执行查询时必须检查的行数。**(这个属性重要)** + - Extra,该列包含MySQL解决查询的详细信息: + - Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。 + - Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。 + - range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。 + - Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。 + - Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。 + - Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。 + - Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。 + - Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。 + - Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。 +- 了解对索引不生效的查询情况 **(这个属性重要)** + - 使用LIKE关键字的查询,在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不起作用。只有“%”不在第一个位置,索引才会生效。 + - 使用联合索引的查询,MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于联合索引,只有查询条件中使用了这些字段中第一个字段时,索引才会生效。 + - 使用OR关键字的查询,查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引列时,索引才会生效,否则,索引不生效。 +- 子查询优化 + - MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。 + - 子查询虽然很灵活,但是执行效率并不高。 + - 执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响。 + - 优化: + - 可以使用连接查询(JOIN)代替子查询,连接查询时不需要建立临时表,其速度比子查询快。 + + +## 数据库结构优化 + +- 将字段很多的表分解成多个表 + - 对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。 + - 因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。 +- 增加中间表 + - 对于需要经常联合查询的表,可以建立中间表以提高查询效率。 + - 通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。 +- 增加冗余字段 + - 设计数据表时应尽量遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来精致、优雅。但是,合理的加入冗余字段可以提高查询速度。 + + + +## 插入数据的优化(适用于 InnoDB) + +- 插入数据时,影响插入速度的主要是索引、唯一性校验、一次插入的数据条数等。 +- 开发环境情况下的考虑: + - 开发场景中,如果需要初始化数据,导入数据等一些操作,而且是开发人员进行处理的,可以考虑在插入数据之前,先禁用整张表的索引, + - 禁用索引使用 SQL:ALTER TABLE table_name DISABLE KEYS; + - 当导入完数据之后,重新让MySQL创建索引,并开启索引:ALTER TABLE table_name ENABLE KEYS; + - 如果表中有字段是有唯一性约束的,可以先禁用,然后在开启: + - 禁用唯一性检查的语句:SET UNIQUE_CHECKS = 0; + - 开启唯一性检查的语句:SET UNIQUE_CHECKS = 1; + - 禁用外键检查(建议还是少量用外键,而是采用代码逻辑来处理) + - 插入数据之前执行禁止对外键的检查,数据插入完成后再恢复,可以提供插入速度。 + - 禁用:SET foreign_key_checks = 0; + - 开启:SET foreign_key_checks = 1; + - 使用批量插入数据 + - 禁止自动提交 + - 插入数据之前执行禁止事务的自动提交,数据插入完成后再恢复,可以提供插入速度。 + - 禁用:SET autocommit = 0; + - 开启:SET autocommit = 1; + + + +## 服务器优化 + +- 好硬件大家都知道,这里没啥好说 +- 通过优化 MySQL 的参数可以提高资源利用率,从而达到提高 MySQL 服务器性能的目的。 + - 可以看我整理的这篇文章: + + +## 资料 + + From 770a9cca130e6c452a37a0af19c54170936d3cb7 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 24 Apr 2016 12:17:52 +0800 Subject: [PATCH 019/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9B=B8=E5=85=B3=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Optimize.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Mysql-Optimize.md b/Mysql-Optimize.md index 4439542a..2e4705dd 100644 --- a/Mysql-Optimize.md +++ b/Mysql-Optimize.md @@ -24,7 +24,7 @@ - id,该列表示当前结果序号,无特殊意义,不重要 - select_type,表示 SELECT 语句的类型,有下面几种 - SIMPLE,表示简单查询,其中不包括连接查询和子查询 - - PRIMARY,表示主查询,或者是最外面的查询语句。比如你使用一个子查询语句,比如这条 SQL:EXPLAIN SELECT * FROM (SELECT `sys_user_id` FROM `sys_user` WHERE `sys_user_id` = 1) AS temp_table; + - PRIMARY,表示主查询,或者是最外面的查询语句。比如你使用一个子查询语句,比如这条 SQL:`EXPLAIN SELECT * FROM (SELECT sys_user_id FROM sys_user WHERE sys_user_id = 1) AS temp_table;` - 这条 SQL 有两个结果,其中有一个结果的类型就是 PRIMARY - UNION,使用 UNION 的SQL是这个类型 - DERIVED,在 SQL 中 From 后面子查询 @@ -40,8 +40,8 @@ - ref_or_null,该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。 - 性能较差: - index_merge,该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。 - - unique_subquery,该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr)。unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。 - - index_subquery,该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr) + - unique_subquery,该类型替换了下面形式的IN子查询的ref: `value IN (SELECT primary_key FROM single_table WHERE some_expr)`。unique_subquery 是一个索引查找函数,可以完全替换子查询,效率更高。 + - index_subquery,该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: `value IN (SELECT key_column FROM single_table WHERE some_expr)` - range,只检索给定范围的行,使用一个索引来选择行。 - index,该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。 - 性能最差: @@ -91,20 +91,20 @@ - 插入数据时,影响插入速度的主要是索引、唯一性校验、一次插入的数据条数等。 - 开发环境情况下的考虑: - 开发场景中,如果需要初始化数据,导入数据等一些操作,而且是开发人员进行处理的,可以考虑在插入数据之前,先禁用整张表的索引, - - 禁用索引使用 SQL:ALTER TABLE table_name DISABLE KEYS; - - 当导入完数据之后,重新让MySQL创建索引,并开启索引:ALTER TABLE table_name ENABLE KEYS; + - 禁用索引使用 SQL:`ALTER TABLE table_name DISABLE KEYS;` + - 当导入完数据之后,重新让MySQL创建索引,并开启索引:`ALTER TABLE table_name ENABLE KEYS;` - 如果表中有字段是有唯一性约束的,可以先禁用,然后在开启: - - 禁用唯一性检查的语句:SET UNIQUE_CHECKS = 0; - - 开启唯一性检查的语句:SET UNIQUE_CHECKS = 1; + - 禁用唯一性检查的语句:`SET UNIQUE_CHECKS = 0;` + - 开启唯一性检查的语句:`SET UNIQUE_CHECKS = 1;` - 禁用外键检查(建议还是少量用外键,而是采用代码逻辑来处理) - 插入数据之前执行禁止对外键的检查,数据插入完成后再恢复,可以提供插入速度。 - - 禁用:SET foreign_key_checks = 0; - - 开启:SET foreign_key_checks = 1; + - 禁用:`SET foreign_key_checks = 0;` + - 开启:`SET foreign_key_checks = 1;` - 使用批量插入数据 - 禁止自动提交 - 插入数据之前执行禁止事务的自动提交,数据插入完成后再恢复,可以提供插入速度。 - - 禁用:SET autocommit = 0; - - 开启:SET autocommit = 1; + - 禁用:`SET autocommit = 0;` + - 开启:`SET autocommit = 1;` From 82687a20c43f518c9df6c425c19434972c431818 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 24 Apr 2016 12:34:09 +0800 Subject: [PATCH 020/730] =?UTF-8?q?2016-04-17=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9B=B8=E5=85=B3=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf index 4ac82433..fb62c72f 100644 --- a/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf +++ b/MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-salve.cnf @@ -39,7 +39,18 @@ log-error = /usr/program/mysql/data/mysql-error.log # (重点修改)表示是本机的序号为1,一般配合设置主从的时候一定要修改的地方 server-id = 1 - +# 从库特有的设置 start +read_only = true +# 从库不自动开启主从设置,需要使用命令:START SLAVE; +skip-slave-start = true +log-slave-updates = true +relay-log = /usr/program/mysql/data/relay-bin +# 单位秒 +slave-net-timeout = 60 +sync_master_info = 1 +sync_relay_log = 1 +sync_relay_log_info = 1 +# 从库特有的设置 end # back_log 值指出在 MySQL 暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果 MySQL 的连接数据达到 max_connections 时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即 back_log,如果等待连接的数量超过 back_log,将不被授予连接资源。 # 另外,这值(back_log)限于您的操作系统对到来的 TCP/IP 连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的 OS 文档找出这个变量的最大值),试图设定 back_log 高于你的操作系统的限制将是无效的。 From a698508b26ca105d4e20a13541bfcdaeb3c26292 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 24 Apr 2016 17:36:06 +0800 Subject: [PATCH 021/730] =?UTF-8?q?2016-04-24=E8=A1=A5=E5=85=85Ubuntu?= =?UTF-8?q?=E4=B8=8B=E5=AE=89=E8=A3=85VMware?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- TOC.md | 6 ++++-- Ubuntu-Install-VMware.md | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 Ubuntu-Install-VMware.md diff --git a/README.md b/README.md index e0d68c5e..5016a71b 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ - [CentOS 介绍](CentOS.md) - [CentOS 安装](CentOS-Install.md) - [CentOS 设置(目录)](centos-settings/centos-settings-toc.md) +- [Ubuntu 安装 VMware](Ubuntu-Install-VMware.md) +- [VMware 克隆 CentOS 后网卡信息修改](CentOS-Virtual-Machine-Copy-Settings.md) - [Vim 安装、配置、快捷键列表](Vim-Install-And-Settings.md) - [Bash 命令](Bash.md) - [Bash 其他常用命令](Bash-Other-Bash.md) @@ -32,7 +34,6 @@ - [Crontab 介绍](Crontab.md) - [Iptables 介绍](Iptables.md) - [花生壳-安装介绍](Hsk-Install.md) -- [VMware 克隆 CentOS 后网卡信息修改](CentOS-Virtual-Machine-Copy-Settings.md) - [JDK 安装](JDK-Install.md) - [SVN 安装和配置](SVN-Install-And-Settings.md) - [Tomcat 安装和配置、优化](Tomcat-Install-And-Settings.md) diff --git a/TOC.md b/TOC.md index b416511d..61d457b6 100644 --- a/TOC.md +++ b/TOC.md @@ -5,6 +5,8 @@ - [CentOS 介绍](CentOS.md) - [CentOS 安装](CentOS-Install.md) - [CentOS 设置(目录)](centos-settings/centos-settings-toc.md) +- [Ubuntu 安装 VMware](Ubuntu-Install-VMware.md) +- [VMware 克隆 CentOS 后网卡信息修改](CentOS-Virtual-Machine-Copy-Settings.md) - [Vim 安装、配置、快捷键列表](Vim-Install-And-Settings.md) - [Bash 命令](Bash.md) - [Bash 其他常用命令](Bash-Other-Bash.md) @@ -20,14 +22,14 @@ - [Crontab 介绍](Crontab.md) - [Iptables 介绍](Iptables.md) - [花生壳-安装介绍](Hsk-Install.md) -- [VMware 克隆 CentOS 后网卡信息修改](CentOS-Virtual-Machine-Copy-Settings.md) - [JDK 安装](JDK-Install.md) - [SVN 安装和配置](SVN-Install-And-Settings.md) - [Tomcat 安装和配置、优化](Tomcat-Install-And-Settings.md) - [Jenkins 安装和配置](Jenkins-Install-And-Settings.md) - [Maven 安装和配置](Maven-Install-And-Settings.md) - [Nexus 安装和配置](Nexus-Install-And-Settings.md) -- [Mysql 安装和配置](Mysql-Install-And-Settings.md) +- [MySQL 安装和配置](Mysql-Install-And-Settings.md) +- [MySQL 教程](Mysql-Tutorial.md) - [Redis 安装和配置](Redis-Install-And-Settings.md) - [Solr 安装和配置](Solr-Install-And-Settings.md) - [Jira 安装和配置](Jira-Install-And-Settings.md) diff --git a/Ubuntu-Install-VMware.md b/Ubuntu-Install-VMware.md new file mode 100644 index 00000000..1c77b65f --- /dev/null +++ b/Ubuntu-Install-VMware.md @@ -0,0 +1,24 @@ +# Ubuntu 安装 VMware + +- 我个人习惯使用 VMware,在一些个性化和兼容性上,我觉得 VMware 比 box 好很多 + + +## 安装说明 + +- 下载:VMware-Workstation-Full-10.0.4-2249910.x86_64.bundle +- 安装组件: +``` nginx +命令:sudo apt-get update && sudo apt-get dist-upgrade && sudo apt-get autoremove +命令:sudo apt-get install build-essential linux-headers-`uname -r` +``` +- 进入软件下载后目录,比如我在 /opt/setups 下 + - `cd /opt/setups` + - `chmod +x VMware*.bundle` + - `sudo ./VMware*.bundle` +- 接下来会弹出图形界面,则效果跟 Windows 一样,那就没啥好说了。 + + +## 资料 + +- [How To Install VMware Workstation 11 On Ubuntu 14.10](https://www.liberiangeek.net/2014/12/install-vmware-workstation-11-ubuntu-14-10/) + From bf436eb98949062a31d8a05768375bab733aed64 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Sun, 24 Apr 2016 23:14:54 +0800 Subject: [PATCH 022/730] =?UTF-8?q?2016-04-24=E5=A2=9E=E5=8A=A0FastDFS=20?= =?UTF-8?q?=E7=BB=93=E5=90=88=20GraphicsMagick=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastDFS-Install-And-Settings.md | 2 +- FastDFS-Nginx-Lua-GraphicsMagick.md | 373 ++++++++++++++++++++++++++++ README.md | 1 + TOC.md | 1 + 4 files changed, 376 insertions(+), 1 deletion(-) create mode 100644 FastDFS-Nginx-Lua-GraphicsMagick.md diff --git a/FastDFS-Install-And-Settings.md b/FastDFS-Install-And-Settings.md index 741ce37e..cb6133c5 100644 --- a/FastDFS-Install-And-Settings.md +++ b/FastDFS-Install-And-Settings.md @@ -1,4 +1,4 @@ -# FastDFS 安装和配置 +# FastDFS 安装和配置 ## 它是什么 diff --git a/FastDFS-Nginx-Lua-GraphicsMagick.md b/FastDFS-Nginx-Lua-GraphicsMagick.md new file mode 100644 index 00000000..4bca747d --- /dev/null +++ b/FastDFS-Nginx-Lua-GraphicsMagick.md @@ -0,0 +1,373 @@ +# FastDFS 结合 GraphicsMagick + + +## 单机安装部署(CentOS 6.7 环境) + + + +### 先安装 FastDFS + +- 软件准备: + - 我这边统一提供了一个压缩包,方便使用。 + - 下载地址: +- 安装依赖包:`yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel libevent` +- 安装 **libfastcommon-1.0.7.tar.gz** + - 解压:`tar zxvf libfastcommon-1.0.7.tar.gz` + - 进入解压后目录:`cd libfastcommon-1.0.7/` + - 编译:`./make.sh` + - 安装:`./make.sh install` + - 设置几个软链接:`ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so` + - 设置几个软链接:`ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so` + - 设置几个软链接:`ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so` + - 设置几个软链接:`ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so` +- 安装 tracker (跟踪器)服务 **FastDFS_v5.08.tar.gz** + - 解压:`tar zxvf FastDFS_v5.05.tar.gz` + - 进入解压后目录:`cd FastDFS/` + - 编译:`./make.sh` + - 安装:`./make.sh install` +- 配置 tracker 服务 + - 复制一份配置文件:`cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf` + - 编辑:`vim /etc/fdfs/tracker.conf`,编辑内容看下面中文注释 + ``` ini + disabled=false + bind_addr= + port=22122 + connect_timeout=30 + network_timeout=60 + # 下面这个路径是保存 store data 和 log 的地方,需要我们改下,指向我们一个存在的目录 + # 创建目录:mkdir -p /opt/fastdfs/tracker/data-and-log + base_path=/opt/fastdfs/tracker/data-and-log + max_connections=256 + accept_threads=1 + work_threads=4 + store_lookup=2 + store_group=group2 + store_server=0 + store_path=0 + download_server=0 + reserved_storage_space = 10% + log_level=info + run_by_group= + run_by_user= + allow_hosts=* + sync_log_buff_interval = 10 + check_active_interval = 120 + thread_stack_size = 64KB + storage_ip_changed_auto_adjust = true + storage_sync_file_max_delay = 86400 + storage_sync_file_max_time = 300 + use_trunk_file = false + slot_min_size = 256 + slot_max_size = 16MB + trunk_file_size = 64MB + trunk_create_file_advance = false + trunk_create_file_time_base = 02:00 + trunk_create_file_interval = 86400 + trunk_create_file_space_threshold = 20G + trunk_init_check_occupying = false + trunk_init_reload_from_binlog = false + trunk_compress_binlog_min_interval = 0 + use_storage_id = false + storage_ids_filename = storage_ids.conf + id_type_in_filename = ip + store_slave_file_use_link = false + rotate_error_log = false + error_log_rotate_time=00:00 + rotate_error_log_size = 0 + log_file_keep_days = 0 + use_connection_pool = false + connection_pool_max_idle_time = 3600 + http.server_port=8080 + http.check_alive_interval=30 + http.check_alive_type=tcp + http.check_alive_uri=/status.html + ``` + - 启动 tracker 服务:`/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf` + - 重启 tracker 服务:`/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart` + - 查看是否有 tracker 进程:`ps aux | grep tracker` +- storage (存储节点)服务部署 + - 一般 storage 服务我们会单独装一台机子,但是这里为了方便我们安装在同一台。 + - 如果 storage 单独安装的话,那上面安装的步骤都要在走一遍,只是到了编辑配置文件的时候,编辑的是 storage.conf 而已 + - 复制一份配置文件:`cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf` + - 编辑:`vim /etc/fdfs/storage.conf`,编辑内容看下面中文注释 + ``` ini + disabled=false + group_name=group1 + bind_addr= + client_bind=true + port=23000 + connect_timeout=30 + network_timeout=60 + heart_beat_interval=30 + stat_report_interval=60 + # 下面这个路径是保存 store data 和 log 的地方,需要我们改下,指向我们一个存在的目录 + # 创建目录:mkdir -p /opt/fastdfs/storage/data-and-log + base_path=/opt/fastdfs/storage/data-and-log + max_connections=256 + buff_size = 256KB + accept_threads=1 + work_threads=4 + disk_rw_separated = true + disk_reader_threads = 1 + disk_writer_threads = 1 + sync_wait_msec=50 + sync_interval=0 + sync_start_time=00:00 + sync_end_time=23:59 + write_mark_file_freq=500 + store_path_count=1 + # 图片实际存放路径,如果有多个,这里可以有多行: + # store_path0=/opt/fastdfs/storage/images-data0 + # store_path1=/opt/fastdfs/storage/images-data1 + # store_path2=/opt/fastdfs/storage/images-data2 + # 创建目录:mkdir -p /opt/fastdfs/storage/images-data + store_path0=/opt/fastdfs/storage/images-data + subdir_count_per_path=256 + # 指定 tracker 服务器的 IP 和端口 + tracker_server=192.168.1.114:22122 + log_level=info + run_by_group= + run_by_user= + allow_hosts=* + file_distribute_path_mode=0 + file_distribute_rotate_count=100 + fsync_after_written_bytes=0 + sync_log_buff_interval=10 + sync_binlog_buff_interval=10 + sync_stat_file_interval=300 + thread_stack_size=512KB + upload_priority=10 + if_alias_prefix= + check_file_duplicate=0 + file_signature_method=hash + key_namespace=FastDFS + keep_alive=0 + use_access_log = false + rotate_access_log = false + access_log_rotate_time=00:00 + rotate_error_log = false + error_log_rotate_time=00:00 + rotate_access_log_size = 0 + rotate_error_log_size = 0 + log_file_keep_days = 0 + file_sync_skip_invalid_record=false + use_connection_pool = false + connection_pool_max_idle_time = 3600 + http.domain_name= + http.server_port=8888 + ``` + - 启动 storage 服务:`/usr/bin/fdfs_storaged /etc/fdfs/storage.conf`,首次启动会很慢,因为它在创建预设存储文件的目录 + - 重启 storage 服务:`/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart` + - 查看是否有 storage 进程:`ps aux | grep storage` +- 测试是否部署成功 + - 利用自带的 client 进行测试 + - 复制一份配置文件:`cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf` + - 编辑:`vim /etc/fdfs/client.conf`,编辑内容看下面中文注释 + ``` ini + connect_timeout=30 + network_timeout=60 + # 下面这个路径是保存 store log 的地方,需要我们改下,指向我们一个存在的目录 + # 创建目录:mkdir -p /opt/fastdfs/client/data-and-log + base_path=/opt/fastdfs/client/data-and-log + # 指定 tracker 服务器的 IP 和端口 + tracker_server=192.168.1.114:22122 + log_level=info + use_connection_pool = false + connection_pool_max_idle_time = 3600 + load_fdfs_parameters_from_tracker=false + use_storage_id = false + storage_ids_filename = storage_ids.conf + http.tracker_server_port=80 + ``` + - 在终端中通过 shell 上传 opt 目录下的一张图片:`/usr/bin/fdfs_test /etc/fdfs/client.conf upload /opt/test.jpg` + - 如下图箭头所示,生成的图片地址为:`http://192.168.1.114/group1/M00/00/00/wKgBclb0aqWAbVNrAAAjn7_h9gM813_big.jpg` + - ![FastDFS](images/FastDFS-a-1.jpg) + - 即使我们现在知道图片的访问地址我们也访问不了,因为我们还没装 FastDFS 的 Nginx 模块 + + +### 安装 nginx-lua-GraphicsMagick + +- 来源: +- 添加专用用户,后面有用 + - `groupadd www` + - `useradd -g www www -s /bin/false` +- 安装依赖包 + - `yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel` + - `yum install -y libpng libjpeg libpng-devel libjpeg-devel ghostscript libtiff libtiff-devel freetype freetype-devel` + - `yum install -y GraphicsMagick GraphicsMagick-devel` +- 下面的这些软件都在本文在开头的那个压缩包里面。现在我们需要解压这些压缩包 + - `cd /opt/setups` + - `tar -zxvf nginx-1.8.0.tar.gz` + - `tar -zxvf LuaJIT-2.0.4.tar.gz` + - `tar -zxvf GraphicsMagick-1.3.21.tar.gz` + - `tar -zxvf zlib-1.2.8.tar.gz` +- 安装 LuaJIT + - `cd /opt/setups/LuaJIT-2.0.4` + - `make` + - `make install` + - `export LUAJIT_LIB=/usr/local/lib` + - `export LUAJIT_INC=/usr/local/include/luajit-2.0` + - `ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2` +- 修改一些配置文件 + - 编辑 Nginx 模块的配置文件:`vim /opt/setups/fastdfs-nginx-module/src/config` + - 找到下面一行包含有 `local` 字眼去掉,因为这三个路径根本不是在 local 目录下的。(如果你的配置文件没有这个 local,那这一步跳过) + ``` nginx + CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" + ``` + - 改为如下: + ``` nginx + CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/" + ``` + - 复制文件:`cp /opt/setups/FastDFS/conf/http.conf /etc/fdfs` + - 复制文件:`cp /opt/setups/FastDFS/conf/mime.types /etc/fdfs` +- 开始安装 Nginx + - `cd /opt/setups/nginx-1.8.0` + - `mkdir -p /usr/local/nginx /var/log/nginx /var/temp/nginx /var/lock/nginx` + - 执行下面编译语句: + ``` nginx + ./configure --prefix=/usr/local/nginx \ + --user=www \ + --group=www \ + --pid-path=/var/local/nginx/nginx.pid \ + --lock-path=/var/lock/nginx/nginx.lock \ + --error-log-path=/var/log/nginx/error.log \ + --http-log-path=/var/log/nginx/access.log \ + --http-client-body-temp-path=/var/temp/nginx/client \ + --http-proxy-temp-path=/var/temp/nginx/proxy \ + --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ + --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ + --http-scgi-temp-path=/var/temp/nginx/scgi \ + --sbin-path=/usr/local/nginx/sbin/nginx \ + --with-http_ssl_module \ + --with-http_realip_module \ + --with-http_sub_module \ + --with-http_flv_module \ + --with-http_dav_module \ + --with-http_gzip_static_module \ + --with-http_stub_status_module \ + --with-http_addition_module \ + --with-http_spdy_module \ + --with-pcre \ + --with-zlib=/opt/setups/zlib-1.2.8 \ + --add-module=/opt/setups/nginx-http-concat \ + --add-module=/opt/setups/lua-nginx-module \ + --add-module=/opt/setups/ngx_devel_kit \ + --add-module=/opt/setups/fastdfs-nginx-module/src + ``` + - `make` + - `make install` +- 修改一下配置 + - 复制 Nginx 模块的配置文件:`cp /opt/setups/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs` + - 编辑 Nginx 模块的配置文件:`vim /etc/fdfs/mod_fastdfs.conf`,编辑内容看下面中文注释 + - 如果在已经启动 Nginx 的情况下修改下面内容记得要重启 Nginx。 + ``` ini + connect_timeout=2 + network_timeout=30 + # 下面这个路径是保存 log 的地方,需要我们改下,指向我们一个存在的目录 + # 创建目录:mkdir -p /opt/fastdfs/fastdfs-nginx-module/data-and-log + base_path=/opt/fastdfs/fastdfs-nginx-module/data-and-log + load_fdfs_parameters_from_tracker=true + storage_sync_file_max_delay = 86400 + use_storage_id = false + storage_ids_filename = storage_ids.conf + # 指定 tracker 服务器的 IP 和端口 + tracker_server=192.168.1.114:22122 + storage_server_port=23000 + group_name=group1 + # 因为我们访问图片的地址是:http://192.168.1.114/group1/M00/00/00/wKgBclb0aqWAbVNrAAAjn7_h9gM813_big.jpg + # 该地址前面是带有 /group1/M00,所以我们这里要使用 true,不然访问不到(原值是 false) + url_have_group_name = true + store_path_count=1 + # 图片实际存放路径,如果有多个,这里可以有多行: + # store_path0=/opt/fastdfs/storage/images-data0 + # store_path1=/opt/fastdfs/storage/images-data1 + # store_path2=/opt/fastdfs/storage/images-data2 + store_path0=/opt/fastdfs/storage/images-data + log_level=info + log_filename= + response_mode=proxy + if_alias_prefix= + flv_support = true + flv_extension = flv + group_count = 0 + ``` + - 创建文件夹:`mkdir -p /opt/fastdfs/thumb` + - 编辑 Nginx 配置文件 + - `vim /usr/local/nginx/conf/nginx.conf` + ``` nginx + # 注意这一行行,我特别加上了使用 root 用户去执行,不然有些日记目录没有权限访问 + user root; + worker_processes 1; + + + events { + worker_connections 1024; + } + + + http { + include mime.types; + default_type application/octet-stream; + + sendfile on; + + keepalive_timeout 65; + + + server{ + listen 80; + server_name 192.168.1.112; + + set $img_thumbnail_root /opt/fastdfs/thumb; + set $img_file $img_thumbnail_root$uri; + + # like:/pic/M00/xx/xx/xx.jpg_200x100.jpg + # /group1/M00 + location ~* ^(\/(\w+)(\/M00)(.+\.(jpg|jpeg|gif|png))_(\d+)+x(\d+)+\.(jpg|jpeg|gif|png))$ { + root $img_thumbnail_root; + set $fdfs_group_root /opt/fastdfs/storage/images-data/data; + + # 如果缩略图不存在 + if (!-f $img_file) { + add_header X-Powered-By 'Nginx+Lua+GraphicsMagick By Yanue'; + add_header file-path $request_filename; + + set $request_filepath $fdfs_group_root$4; + set $img_width $6; + set $img_height $7; + set $img_ext $5; + content_by_lua_file /opt/setups/lua/cropSize.lua; + } + } + + location /group1/M00 { + alias /opt/fastdfs/storage/images-data/data; + ngx_fastdfs_module; + } + + } + } + ``` + - 启动 Nginx + - 停掉防火墙:`service iptables stop` + - 启动:`/usr/local/nginx/sbin/nginx`,启动完成 shell 是不会有输出的 + - 访问:`192.168.1.114`,如果能看到:`Welcome to nginx!`,即可表示安装成功 + - 检查 时候有 Nginx 进程:`ps aux | grep nginx`,正常是显示 3 个结果出来 + - 刷新 Nginx 配置后重启:`/usr/local/nginx/sbin/nginx -s reload` + - 停止 Nginx:`/usr/local/nginx/sbin/nginx -s stop` + - 如果访问不了,或是出现其他信息看下错误立即:`vim /var/log/nginx/error.log` + + + +### 多机安装部署(CentOS 6.7 环境) + +- 多机部署的情况,对生成大小图的 Nginx 也有地方要修改。 +- 资料: + + + +## 资料 + +- [fastdfs+nginx安装配置](http://blog.csdn.net/ricciozhang/article/details/49402273) + + diff --git a/README.md b/README.md index 5016a71b..21bc4590 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ - [TeamCity 安装和配置](TeamCity-Install-And-Settings.md) - [Nginx 安装和配置](Nginx-Install-And-Settings.md) - [FastDFS 安装和配置](FastDFS-Install-And-Settings.md) +- [FastDFS 结合 GraphicsMagick](FastDFS-Nginx-Lua-GraphicsMagick.md) - [RabbitMQ 安装和配置](RabbitMQ-Install-And-Settings.md) - [黑客入侵检查](Was-Hacked.md) diff --git a/TOC.md b/TOC.md index 61d457b6..9de71aa1 100644 --- a/TOC.md +++ b/TOC.md @@ -37,5 +37,6 @@ - [TeamCity 安装和配置](TeamCity-Install-And-Settings.md) - [Nginx 安装和配置](Nginx-Install-And-Settings.md) - [FastDFS 安装和配置](FastDFS-Install-And-Settings.md) +- [FastDFS 结合 GraphicsMagick](FastDFS-Nginx-Lua-GraphicsMagick.md) - [RabbitMQ 安装和配置](RabbitMQ-Install-And-Settings.md) - [黑客入侵检查](Was-Hacked.md) \ No newline at end of file From 02becb4193d768d7d5845d31f383ae0ee6806516 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Wed, 27 Apr 2016 21:44:21 +0800 Subject: [PATCH 023/730] =?UTF-8?q?2016-04-27=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 8426e9a8..03baf59b 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -1,7 +1,7 @@ -# Mysql 安装和配置 +# MySQL 安装和配置 -## Mysql 安装 +## MySQL 安装 - Mysql 安装 - 官网: @@ -44,7 +44,10 @@ - 常用命令软连接,才可以在终端直接使用:mysql 和 mysqladmin 命令 - `sudo ln -s /usr/program/mysql/bin/mysql /usr/bin` - `sudo ln -s /usr/program/mysql/bin/mysqladmin /usr/bin` - + - 开放防火墙端口: + - `sudo iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT` + - `sudo service iptables save` + - `sudo service iptables restart` ## 修改 root 账号密码 @@ -63,21 +66,23 @@ - 重启 MySQL 服务:`service mysql restart` -## Mysql 配置 +## MySQL 配置 - 官网配置参数解释: - 找一下当前系统中有多少个 my.cnf 文件:`find / -name "my.cnf"`,我查到的结果: - ``` nginx - /etc/my.cnf - /usr/program/mysql/my.cnf - /usr/program/mysql/mysql-test/suite/ndb/my.cnf - /usr/program/mysql/mysql-test/suite/ndb_big/my.cnf - ............. - /usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf - ``` - - 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 - - 我整理的一个单机版配置说明(MySQL 5.6,适用于 1G 内存的服务器): - - [my.cnf](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf) + +``` nginx +/etc/my.cnf +/usr/program/mysql/my.cnf +/usr/program/mysql/mysql-test/suite/ndb/my.cnf +/usr/program/mysql/mysql-test/suite/ndb_big/my.cnf +............. +/usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf +``` + +- 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 +- 我整理的一个单机版配置说明(MySQL 5.6,适用于 1G 内存的服务器): + - [my.cnf](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf) ## MySQL 主从复制 From 3aa80c8dc5e8a6dc4c94631c758c09c27815debf Mon Sep 17 00:00:00 2001 From: YouMeek Date: Thu, 28 Apr 2016 06:55:34 +0800 Subject: [PATCH 024/730] =?UTF-8?q?2016-04-28=E5=AE=8C=E5=96=84MySQL?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mysql-Install-And-Settings.md | 51 +++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/Mysql-Install-And-Settings.md b/Mysql-Install-And-Settings.md index 03baf59b..efbabd43 100644 --- a/Mysql-Install-And-Settings.md +++ b/Mysql-Install-And-Settings.md @@ -39,31 +39,16 @@ - `sudo useradd -g mysql mysql -s /bin/false` #创建用户mysql并加入到mysql组,不允许mysql用户直接登录系统 - `sudo chown -R mysql:mysql /usr/program/mysql/data` #设置MySQL数据库目录权限 - 初始化数据库:`sudo /usr/program/mysql/scripts/mysql_install_db --basedir=/usr/program/mysql --datadir=/usr/program/mysql/data --skip-name-resolve --user=mysql` - - 启动 Mysql 服务器:`service mysql start` - - 查看是否已经启动了:`ps aux | grep mysql` + - 开放防火墙端口: + - `sudo iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT` + - `sudo service iptables save` + - `sudo service iptables restart` + - 禁用 selinux + - 编辑配置文件:`vim /etc/selinux/config` + - 把 `SELINUX=enforcing` 改为 `SELINUX=disabled` - 常用命令软连接,才可以在终端直接使用:mysql 和 mysqladmin 命令 - `sudo ln -s /usr/program/mysql/bin/mysql /usr/bin` - `sudo ln -s /usr/program/mysql/bin/mysqladmin /usr/bin` - - 开放防火墙端口: - - `sudo iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT` - - `sudo service iptables save` - - `sudo service iptables restart` - -## 修改 root 账号密码 - -- 默认安装情况下,root 的密码是空,所以为了方便我们可以设置一个密码,假设我设置为:123456 -- 终端下执行:`mysql -uroot` - - 现在进入了 mysql 命令行管理界面,输入:`SET PASSWORD = PASSWORD('123456');` -- 修改密码后,终端下执行:`mysql -uroot -p` - - 根据提示,输入密码进度 mysql 命令行状态。 -- 如果你在其他机子上连接该数据库机子报:**Access denied for user 'root'@'localhost' (using password: YES)** - - 解决办法: - - 在终端中执行:`service mysql stop` - - 在终端中执行:`/usr/program/mysql/bin/mysqld --skip-grant-tables` - - 此时 MySQL 服务会一直处于监听状态,你需要另起一个终端窗口来执行接下来的操作 - - 在终端中执行:`mysql -u root mysql` - - 进入 MySQL 命令后执行:`UPDATE user SET Password=PASSWORD('填写你要的新密码') where USER='root';FLUSH PRIVILEGES;` - - 重启 MySQL 服务:`service mysql restart` ## MySQL 配置 @@ -79,11 +64,31 @@ ............. /usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf ``` - + + - 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 - 我整理的一个单机版配置说明(MySQL 5.6,适用于 1G 内存的服务器): - [my.cnf](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf) +## 修改 root 账号密码 + +- 启动 Mysql 服务器:`service mysql start` +- 查看是否已经启动了:`ps aux | grep mysql` +- 默认安装情况下,root 的密码是空,所以为了方便我们可以设置一个密码,假设我设置为:123456 +- 终端下执行:`mysql -uroot` + - 现在进入了 mysql 命令行管理界面,输入:`SET PASSWORD = PASSWORD('123456');` +- 修改密码后,终端下执行:`mysql -uroot -p` + - 根据提示,输入密码进度 mysql 命令行状态。 +- 如果你在其他机子上连接该数据库机子报:**Access denied for user 'root'@'localhost' (using password: YES)** + - 解决办法: + - 在终端中执行:`service mysql stop` + - 在终端中执行:`/usr/program/mysql/bin/mysqld --skip-grant-tables` + - 此时 MySQL 服务会一直处于监听状态,你需要另起一个终端窗口来执行接下来的操作 + - 在终端中执行:`mysql -u root mysql` + - 进入 MySQL 命令后执行:`UPDATE user SET Password=PASSWORD('填写你要的新密码') where USER='root';FLUSH PRIVILEGES;` + - 重启 MySQL 服务:`service mysql restart` + + ## MySQL 主从复制 From 600eb7d85b88966387dc16eb3c632a8ee84f4232 Mon Sep 17 00:00:00 2001 From: YouMeek Date: Thu, 28 Apr 2016 07:22:59 +0800 Subject: [PATCH 025/730] =?UTF-8?q?2016-04-28=E6=B7=BB=E5=8A=A0openfire?= =?UTF-8?q?=E5=92=8CrapAPI=E7=9A=84=E8=8D=89=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Openfire-Install-And-Settings.md | 70 ++++++++++++++++++++++++++++++++ README.md | 2 + Rap-Install-And-Settings.md | 42 +++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 Openfire-Install-And-Settings.md create mode 100644 Rap-Install-And-Settings.md diff --git a/Openfire-Install-And-Settings.md b/Openfire-Install-And-Settings.md new file mode 100644 index 00000000..3071d51f --- /dev/null +++ b/Openfire-Install-And-Settings.md @@ -0,0 +1,70 @@ +# Openfire 安装和配置 + + +## 本机环境 + +- 系统:CentOS 6.7 64 位 +- JDK 1.8 64 位 +- MySQL 5.6 + + + +## Openfire 说明 + + +- 官网: +- 官网下载: +- 官网插件列表: +- 官网文档: +- 官网安装手册: +- 官网安装手册-中文翻译版本: +- 官网数据库部署手册: +- javadoc 文档: +- 连接管理工具(上千用户的时候用): + + +## 下载 + +- 官网下载: +- 当前最新版本:**4.0.2**,下载文件:`openfire-4.0.2-1.i386.rpm` + + +## 安装 MySQL、JDK + +- [MySQL 安装和配置](Mysql-Install-And-Settings.md) +- [JDK 安装](JDK-Install.md) + + +## 安装 Openfire + +- JDK 1.7 或以上,我这里使用 1.7 +- CentOS 系列(Red Hat、Fedora)官网推荐安装 RPM 文件,因为有一些相关环境他们帮我们考虑了 +- 安装命令:`rpm -ivh openfire-4.0.2-1.i386.rpm` +- Openfire 默认给我们生成安装目录:**/opt/openfire** +- 修改 JDK VM 参数:`vim /etc/sysconfig/openfire`,找到 23 行,打开 OPENFIRE_OPTS 删除这一行注释,分配多少 VM 你根据自己的机子来配置。 +- 数据库的 my.cnf 文件建议采用我 MySQL 文章中推荐的 my.cnf。 +- 初始化数据库: + - 默认的初始化数据库脚本在(其他数据库类型的脚本也在这个目录下):**/opt/openfire/resources/database/openfire_mysql.sql** + - 进入 MySQL 命令行状态:`mysql -u root -p` + - 创建数据库:`create database `openfire` character set utf8;` + - 退出 MySQL 命令行模式,在终端命令状态下,执行:`sudo mysql -u root -p openfire < /opt/openfire/resources/database/openfire_mysql.sql` +- 先停掉防火墙:`service iptables stop` +- 启动:`/etc/init.d/openfire start` +- 查看进程:`ps aux | grep openfire` +- 停止:`/etc/init.d/openfire stop` +- 重启:`/etc/init.d/openfire restart` +- 访问:`http://192.168.1.113:9090` + + +- 数据库 URL 需要特别注意的是需要加入编码设置:jdbc:mysql://192.168.1.113:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 +- 找到配置文件:conf/openfire.xml,连接mysql的地址改为: ?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 + + +如果连接不了数据库,可以看错误日志:`cat /opt/openfire/logs/error.log` + + + + +## 配置 + + diff --git a/README.md b/README.md index 21bc4590..5607c197 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ - [FastDFS 安装和配置](FastDFS-Install-And-Settings.md) - [FastDFS 结合 GraphicsMagick](FastDFS-Nginx-Lua-GraphicsMagick.md) - [RabbitMQ 安装和配置](RabbitMQ-Install-And-Settings.md) +- [Openfire 安装和配置](Openfire-Install-And-Settings.md) +- [Rap 安装和配置](Rap-Install-And-Settings.md) - [黑客入侵检查](Was-Hacked.md) diff --git a/Rap-Install-And-Settings.md b/Rap-Install-And-Settings.md new file mode 100644 index 00000000..8819ae20 --- /dev/null +++ b/Rap-Install-And-Settings.md @@ -0,0 +1,42 @@ +# Rap 安装和配置 + + +## 本机环境 + +- 系统:CentOS 6.7 64 位 +- JDK 1.8 64 位 +- MySQL 5.6 + + + +## Rap 说明 + + +- 官网: +- 在线版: +- 官网 Wiki: +- 官网部署手册: +- 用户手册: + + +## 下载 + +- 官网下载: +- 当前最新版本:**0.14.1** +- 下载 war 部署包:`wget http://rap.taobao.org/release/RAP-0.14.1-SNAPSHOT.war` + + +## 安装 MySQL、JDK、Tomcat + +- [MySQL 安装和配置](Mysql-Install-And-Settings.md) +- [JDK 安装](JDK-Install.md) +- [Tomcat 安装和配置、优化](Tomcat-Install-And-Settings.md) + + +## 安装 Rap + + + +## 配置 + + From 5123dc4a9d4f0ffb9af2c8b3ac62ac1e41484a8d Mon Sep 17 00:00:00 2001 From: judasn Date: Thu, 28 Apr 2016 09:08:49 +0800 Subject: [PATCH 026/730] =?UTF-8?q?2016-04-28=E8=A1=A5=E5=85=85Openfire?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Openfire-Install-And-Settings.md | 35 +++++++++++++++++-------------- images/Openfire-Settings-a-1.jpg | Bin 0 -> 198692 bytes images/Openfire-Settings-a-2.jpg | Bin 0 -> 181252 bytes images/Openfire-Settings-a-3.jpg | Bin 0 -> 184059 bytes images/Openfire-Settings-a-4.jpg | Bin 0 -> 217572 bytes images/Openfire-Settings-a-5.jpg | Bin 0 -> 202960 bytes images/Openfire-Settings-a-6.jpg | Bin 0 -> 202006 bytes images/Openfire-Settings-a-7.jpg | Bin 0 -> 151346 bytes images/Openfire-Settings-a-8.jpg | Bin 0 -> 126604 bytes images/Openfire-Settings-a-9.jpg | Bin 0 -> 290011 bytes 10 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 images/Openfire-Settings-a-1.jpg create mode 100644 images/Openfire-Settings-a-2.jpg create mode 100644 images/Openfire-Settings-a-3.jpg create mode 100644 images/Openfire-Settings-a-4.jpg create mode 100644 images/Openfire-Settings-a-5.jpg create mode 100644 images/Openfire-Settings-a-6.jpg create mode 100644 images/Openfire-Settings-a-7.jpg create mode 100644 images/Openfire-Settings-a-8.jpg create mode 100644 images/Openfire-Settings-a-9.jpg diff --git a/Openfire-Install-And-Settings.md b/Openfire-Install-And-Settings.md index 3071d51f..3c0dcf39 100644 --- a/Openfire-Install-And-Settings.md +++ b/Openfire-Install-And-Settings.md @@ -4,11 +4,10 @@ ## 本机环境 - 系统:CentOS 6.7 64 位 -- JDK 1.8 64 位 +- JDK 1.7 64 位 - MySQL 5.6 - ## Openfire 说明 @@ -37,34 +36,38 @@ ## 安装 Openfire -- JDK 1.7 或以上,我这里使用 1.7 +- 要求:JDK 1.7 或以上,我这里使用 1.7 - CentOS 系列(Red Hat、Fedora)官网推荐安装 RPM 文件,因为有一些相关环境他们帮我们考虑了 - 安装命令:`rpm -ivh openfire-4.0.2-1.i386.rpm` - Openfire 默认给我们生成安装目录:**/opt/openfire** - 修改 JDK VM 参数:`vim /etc/sysconfig/openfire`,找到 23 行,打开 OPENFIRE_OPTS 删除这一行注释,分配多少 VM 你根据自己的机子来配置。 -- 数据库的 my.cnf 文件建议采用我 MySQL 文章中推荐的 my.cnf。 - 初始化数据库: + - 请确保数据库是运行状态 - 默认的初始化数据库脚本在(其他数据库类型的脚本也在这个目录下):**/opt/openfire/resources/database/openfire_mysql.sql** - 进入 MySQL 命令行状态:`mysql -u root -p` - - 创建数据库:`create database `openfire` character set utf8;` - - 退出 MySQL 命令行模式,在终端命令状态下,执行:`sudo mysql -u root -p openfire < /opt/openfire/resources/database/openfire_mysql.sql` + - 创建数据库并授权:`create database `openfire` character set utf8;grant all privileges on openfire.* to 'root'@'%';flush privileges;` + - **退出** MySQL 命令行模式,**在终端命令状态下**,执行:`sudo mysql -u root -p openfire < /opt/openfire/resources/database/openfire_mysql.sql` - 先停掉防火墙:`service iptables stop` - 启动:`/etc/init.d/openfire start` - 查看进程:`ps aux | grep openfire` - 停止:`/etc/init.d/openfire stop` - 重启:`/etc/init.d/openfire restart` -- 访问:`http://192.168.1.113:9090` - - -- 数据库 URL 需要特别注意的是需要加入编码设置:jdbc:mysql://192.168.1.113:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 -- 找到配置文件:conf/openfire.xml,连接mysql的地址改为: ?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 - - -如果连接不了数据库,可以看错误日志:`cat /opt/openfire/logs/error.log` - - ## 配置 +- 访问:`http://192.168.1.113:9090` +- 开始向导配置 Openfire 具体步骤看下列一系列图: + - 需要注意的是:在配置数据库 URL 需要特别注意的是需要加入编码设置(你可以按我的这个链接来,但是 IP 和数据库名你自己修改): + - `jdbc:mysql://192.168.1.113:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8` + - 如果连接不了数据库,可以看错误日志:`cat /opt/openfire/logs/error.log` +- ![设置](images/Openfire-Settings-a-1.jpg) +- ![设置](images/Openfire-Settings-a-2.jpg) +- ![设置](images/Openfire-Settings-a-3.jpg) +- ![设置](images/Openfire-Settings-a-4.jpg) +- ![设置](images/Openfire-Settings-a-5.jpg) +- ![设置](images/Openfire-Settings-a-6.jpg) +- ![设置](images/Openfire-Settings-a-7.jpg) +- ![设置](images/Openfire-Settings-a-8.jpg) +- ![设置](images/Openfire-Settings-a-9.jpg) diff --git a/images/Openfire-Settings-a-1.jpg b/images/Openfire-Settings-a-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8249d90263cb7d241f1bf293247165263dcb8012 GIT binary patch literal 198692 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¬5ja7H?Pp-`6d=MZL`G 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