nfs设置固定端口并添加防火墙规则

nfs启动时会随机启动多个端口并向RPC注册,这样如果使用iptables对NFS端口进行限制就会有点麻烦,可以更改配置文件固定NFS服务相关端口。这样设置固定端口以后即便重启机器也很方便挂载,如果不设置固定端口,机器或服务重启后之前添加的iptables规则就失效了,

下面的是没有设置固定端口时的情况

未分类

设置固定端口:

编辑 /etc/sysconfig/nfs 文件:

vim    /etc/sysconfig/nfs

添加如下内容:

RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004

未分类

添加后保存退出并重启 rpcbind和nfs

service  rpcbind   restart

service   nfs  restart

重启服务后再查看端口:

未分类

添加iptables规则

[root@file-server ~]# iptables -A INPUT -s 192.168.214.0/24 -p tcp –dport 111 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 192.168.214.0/24 -p udp –dport 111 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 192.168.214.0/24 -p tcp –dport 2049 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 192.168.214.0/24 -p udp –dport 2049 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 192.168.214.0/24 -p tcp –dport 30001:30004 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 192.168.214.0/24 -p udp –dport 30001:30004 -j ACCEPT

保存规则:

service   iptables    save

查看可以挂载的目录

[root@file-server ~]# showmount -e localhost

Export list for localhost:
/share 192.168.214.0/24

最后,可以编辑 /etc/exports 添加其他挂载目录

未分类

mysql select into outfile 语法 乱码问题

一个常见的问题,mysql 导出csv格式的语法,已经乱码问题:
由于数据库一般默认的是UTF-8 格式的字符集,而execl默认的是gbk格式的字符集,这里有两种方法解决乱码:

方法一: 先转出.txt格式的文件,然后选择用excel打开时,提示选择哪种编码打开,选择gbk即可

select * from mobile_order_region where school_id=6921 into outfile '/tmp/6921.txt'

方法二:导出时直接设置字符集格式:

mysql> select * from mobile_order_region where school_id=6921 into outfile '/tmp/6921.csv'
CHARACTER SET gbk
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY 'n';
Query OK, 6888 rows affected (0.11 sec)


mysql> q

使用Stunnel为MySQL Server建立SSL隧道

笔者接手的一个项目有如下需求:

两台主机A和B,A上运行一个MySQL服务器和一套基于PHP的、以MySQL为数据库的CMS;B上除MySQL服务器外,其他皆与A相同。

要求B能安全地(通过SSL)连接A上的MySQL服务器,而这个CMS本身不支持MySQL over SSL

Stunnel可以提供一个安全的SSL隧道,理论上可以承载任何应用层协议——包括MySQL。

以下操作在A和B上执行

OpenSSL的目录需根据实际情况设置,Stunnel最高支持OpenSSL 1.1.1-dev

tar zxvf stunnel-5.44.tar.gz  
cd stunnel-5.44/

#编译安装至/opt/stunnel,配置文件存放于/etc/stunnel
./configure --prefix= --exec-prefix=/opt/stunnel --with-ssl=/opt/openssl-1.1.0g LDFLAGS="-Wl,--rpath=/opt/openssl-1.1.0g/lib -L/opt/openssl-1.1.0g/lib -lssl -lcrypto"
make  
make install  

建立systemd service文件/lib/systemd/system/stunnel.service,内容如下:

[Unit]
Description=SSL tunnel daemons  
After=network.target  
After=syslog.target

[Install]
WantedBy=multi-user.target  
Alias=stunnel.target

[Service]
Type=forking  
ExecStart=/opt/stunnel/bin/stunnel /etc/stunnel/stunnel.conf  
ExecStop=/bin/kill -TERM $MAINPID  
ExecReload=/bin/kill -USR1 $MAINPID

# Give up if ping don't get an answer
TimeoutSec=600

Restart=always  
PrivateTmp=false  

执行systemctl daemon-reload令更改生效

编辑A机(服务器端)的stunnel配置文件(/etc/stunnel/stunnel.conf,下同)

pid = /var/run/stunnel4/stunnel4.pid  
#只允许使用AES-GCM且具有前向安全性的加密套件
ciphers = ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256  
#只允许使用TLS 1.2
options = NO_SSLv2  
options = NO_SSLv3  
options = NO_TLSv1  
options = NO_TLSv1.1

options = CIPHER_SERVER_PREFERENCE  
options = DONT_INSERT_EMPTY_FRAGMENTS  
renegotiation = no

[mysql]
#SSL证书与私钥
cert = /path/to/cert_with_intermediate_CA.cer  
key = /path/to/private_key.key  
#SSL监听端口
accept  = 6033  
#MySQL监听地址及端口
connect = 127.0.0.1:3306  

编辑B机的Stunnel配置文件

pid = /var/run/stunnel4/stunnel4.pid

[mysql]
#本地(明文)监听端口
accept  = 127.0.0.1:3306  
#远程(SSL)地址及端口
connect = {A_IP_ADDR}:6033  
#使用客户端模式
client = yes  

编辑完后,A机和B机分别执行systemctl restart stunnel4.service以重启Stunnel

测试:

在B机执行openssl sclient -crlf -connect {AIP_ADDR}:6033,若出现类似如下报文,则A机配置无问题。

j  
5.5.5-10.0.31-MariaDB-0ubuntu0.16.04.2?J%wLÿ? UD6!Clu)iWY9mysql_native_password  

可以在命令后添加-ssl3|-tls1|-tls1_1以测试是否确实禁用低版本SSL协议。

在B机执行telnet 127.0.0.1 3306,若返回类似报文,则B机配置也无问题。

此时,B机上的PHP程序,数据库连接部分保持与A机上的相同即可。

centos7忘记mysql密码

个人环境

  • mysql 5.7.16
  • centos 7.4

1. 修改mysql配置文件

编辑配置文件

vim /etc/my.cnf

按i在[mysqld]中添加skip-grant-tables,即跳过权限认证

skip-grant-tables

按esc后输入:wq保存退出

2. 重启mysql

输入命令重启

service mysqld restart

3. 登录mysql

mysql -u root -p

无需输入密码直接回车进入mysql

4. 修改mysql的root密码

选择mysql数据库

use mysql;

修改root密码 (密码需要满足mysql的密码策略,见底部)

update user set authentication_string=password('你的密码') where user='root';

刷新权限

flush privileges;

退出mysql

quit;

5. 修改/etc/my.cnf 删除skip-grant-tables

6. 重启mysql

service mysqld restart

7. 再次登录mysql,出现错误提示

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
修改密码即可

set password=password("密码");

密码策略如下:

  • 至少8位
  • 至少包含1位特殊字符
  • 至少包含大小写混合
  • 至少1位数字
  • 如果出现1819错误,代表密码不符合要求
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

MySQL中报错:Can’t find file: ‘./mysql/plugin.frm’的解决方法

发现问题

最近在工作中发现了一个问题,这个问题就是MySQL的磁盘满了,将数据库目录data移动到/data3目录,/etc/my.cnf里面也修改了相应的datadir目录,权限也赋予了,但是service mysql start;的时候报错,下面话不多说了,来一起看看详细的解决方法吧。

error log显示如下:

2017-09-15 16:01:01 2420 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
2017-09-15 16:01:01 2420 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2017-09-15 16:01:01 2420 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
2017-09-15 16:01:01 2420 [Note] InnoDB: Using atomics to ref count buffer pool pages
2017-09-15 16:01:01 2420 [Note] InnoDB: The InnoDB memory heap is disabled
2017-09-15 16:01:01 2420 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2017-09-15 16:01:01 2420 [Note] InnoDB: Memory barrier is not used
2017-09-15 16:01:01 2420 [Note] InnoDB: Compressed tables use zlib 1.2.8
2017-09-15 16:01:01 2420 [Note] InnoDB: Using Linux native AIO
2017-09-15 16:01:01 2420 [Note] InnoDB: Using CPU crc32 instructions
2017-09-15 16:01:01 2420 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2017-09-15 16:01:02 2420 [Note] InnoDB: Completed initialization of buffer pool
2017-09-15 16:01:02 2420 [ERROR] InnoDB: ./ibdata1 can't be opened in read-write mode
2017-09-15 16:01:02 2420 [ERROR] InnoDB: The system tablespace must be writable!
2017-09-15 16:01:02 2420 [ERROR] Plugin 'InnoDB' init function returned error.
2017-09-15 16:01:02 2420 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2017-09-15 16:01:02 2420 [ERROR] Unknown/unsupported storage engine: InnoDB
2017-09-15 16:01:02 2420 [ERROR] Aborting

去先检查plugin.frm权限,frm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果出现特殊情况出现frm文件损坏也不要放弃希望,当修复MyISAM和InnoDB表时,MySQL服务会首先去调用frm文件,所以我们只能通过修复frm文件进行后面的数据恢复。

然后我们发现plugin.frm有权限,也是mysql属主:

root@hutaojie-1-pdd-sh:/data1/mysql/mysql# ll plugin.*
-rwxrwxrwx 1 mysql mysql 8586 Mar 6 2016 plugin.frm*
-rwxrwx--x 1 mysql mysql 116 Mar 6 2016 plugin.MYD*
-rwxrwx--x 1 mysql mysql 2048 Mar 6 2016 plugin.MYI*
root@hutaojie-1-pdd-sh:/data1/mysql/mysql#

google之后发现,原来问题在os这里,ubatu的mysql通过yum安装或者rpm安装的时候,会建一个/etc/apparmor.d/usr.sbin.mysqld 文件,如果数据目录不在这里面,则会报错,

/usr/sbin/mysqld: Can't find file: ‘./mysql/plugin.frm' (errno: 13 - Permission denied)

解决方法

所以解决办法是在里面加上新的datadir目录。

root@huayuan:/var/lib# vim /etc/apparmor.d/usr.sbin.mysqld 

# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>

/usr/sbin/mysqld {
 #include <abstractions/base>
 #include <abstractions/nameservice>
 #include <abstractions/user-tmp>
 #include <abstractions/mysql>
 #include <abstractions/winbind>

 capability dac_override,
 capability sys_resource,
 capability setgid,
 capability setuid,

 network tcp,

 /run/mysqld/mysqld.pid rw,
 /run/mysqld/mysqld.sock w,

 /sys/devices/system/cpu/ r,
 #.........这里面写新的datadir目录,写2行,一行r,一行rwk。
 /data3/mysql/ r,
 /data3/mysql/** rwk,
 # Site-specific additions and overrides. See local/README for details.
 #include <local/usr.sbin.mysqld>
}

然后重启mysql实例,ok,问题解决。

Drupal 8在Debian上安装配置MySQL

本教程介绍为Drupal 8在Debian使用APT安装MySQL,因为使用APT安装方便简单,要安装MySQL需要安装MySQL官方APT软件源。

在Debian上安装MySQL数据库

1)下载MySQL Apt源安装包

进入MySQL官方软件源下载页面,下载Debian软件源

wget https://dev.mysql.com/get/mysql-apt-config_0.8.7-1_all.deb

2)安装MySQL Apt源

安装下载的MySQL Apt软件包

sudo dpkg -i mysql-apt-config_0.8.7-1_all.deb

运行命令后,会弹出安装选择软件集界面:

未分类

选择的软件选集有三项:

  • MySQL Server & Cluster:MySQL服务器软件包,必选

  • MySQL Tools & Connectors:MySQL一些工具包和一些动态链接库,一般情况下应该选择为:Enabled

  • MySQL Preview Packages:mysql-shell高级命令行工具,但是在Debian中此包为空

使用上下方向键移动选定某项,选中后按“Enter”键进入设置,如选择MySQL服务器:

未分类

使用上下方向键移动选项,选中后按“Enter”选择服务器的版本。

三项都设置完成后,使用上下方向键移动到“OK”项,然后按“Enter”,安装软件源。

3)更新软件源

sudo apt-get update

4)安装MySQL数据库服务器

sudo apt-get install mysql-community-server

在安装过程中会提示你输入密码:

未分类

5)启动MySQL数据库服务器

sudo systemctl start mysql

6)使MySQL数据库服务器开机自启动

sudo systemctl enable mysql

为Drupal 8创建所需的数据库和角色(用户)

1)使用mysql命令登陆数据库服务器

mysql -u root -p

2)创建Drupal 8使用的数据库

create database drupal_db;

把drupal_db替换为你要使用的数据库名。

3)为Drupal 8网站单独创建一个用户,用以连接数据库

CREATE USER 'drupal_user'@'localhost' IDENTIFIED BY 'password';

把drupal_user替换为你要使用的用户名,把password替换为你使用的密码。

4)把对数据库drupal_db的所有操作权限赋予drupal_user

GRANT ALL ON drupal_db.* TO 'drupal_user'@'localhost';

5)Drupal 8使用MariaDB数据库设置

在Drupal 8安装过程中,如果选择使用MariaDB数据库,只需把我们创建的数据库,用户,密码输入

未分类

然后点击“保存并继续”按钮。

MySQL数据库排他锁与共享锁

未分类

导语:“简单印象”头条号每天将不定时发布一篇文章,文章内容大多为原创性技术相关或技术人的另一面生活,欢迎大家收藏文章或点击右上角的“关注”,支持我的头条号,也可以直接访问我的个人博客(http://www.thanks.live)查看最新撰写的文章。同时,也非常高兴能看到大家在文章底部评论区讨论、指正文章的不当之处,分享中可以寻找到技术人独有的快乐~~~
我们先针对mysql数据库的排他锁、共享锁给出下面一个结论:

结论:

(1)共享锁【S锁】:又称读锁,若事务T是最早对数据对象A加上S锁的事务,则事务T可以读A也能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 共享锁使用方式:SELECT … LOCK IN SHARE MODE;
(2)排他锁【X锁】:又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再修改A,但可以读取A。排他锁使用方式:SELECT … FOR UPDATE;

验证结论:

未分类

目标表(表名:test)结构及初始数据
上述,我们创建了一个测试表,表名为test,其中,id、a、b、c为该表的字段,id为表自增字段。为了防止数据库自动提交,特别强调,需要设置 set autocommit=0。同时,为了模拟两个session同时操作同一数据集,我们需要开启两个操作窗口进行整个试验。

未分类

两个session会话,设置autocommit =0
上述,我们创建了两个窗口,1.mysql 和 2.mysql。下面验证共享锁部分的结论:
(1)在1.mysql中执行:select * from test where id=1 lock in share mode;
(2)在2.mysql中执行:select * from test where id=1 for update; 此时执行失败
(3)在2.mysql中执行:select * from test where id=1 lock in share mode; 执行成功

未分类

(1)(2)(3)
以上结果表明:若事务T是最早对数据对象A加上S锁的事务,其他事务只能再对A加S锁,而不能加X锁
(4)在1.mysql中执行,select * from test where id=1; 执行成功
(5)在2.mysql中执行,select * from test where id=1; 执行成功
(6)在1.mysql中执行,update test set a=’字段a-行1-1.mysql修改’ where id=1;执行成功
(7)在2.mysql中执行,update test set a=’字段a-行1-2.mysql修改’ where id=1;执行失败,产生死锁
(8)在1.mysql中执行,commit;提交事务T成功,字段a的值修改为:字段a-行1-1.mysql修改

未分类

(4)(5)(6)(7)(8)
(9)在2.mysql中执行,update test set a=’字段a-行1-2.mysql修改’ where id=1;执行成功
(10)在2.mysql中执行,commit; 提交事务成功,字段a的值修改为:字段a-行1-2.mysql修改

未分类

(9)(10)
以上结果表明:若事务T是最早对数据对象A加上S锁的事务,其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。如果其他事务同时对数据添加S锁,并写与事务T相同的数据集,很可能会导致死锁发生。
关于排他锁的结论部分验证,读者可以按相同验证思维得证,这里就不再阐述。

特别提醒:

(1)因为排他锁、共享锁属于行级锁,所以,本文基于MySQL中的InnoDB引擎
(2)在验证的过程中,需设置 set autocommit =0 关闭自动提交
(3)只有执行了commit或rollback后,才认为一个事务结束
(4)假设id为主键,则:(lock in share mode同下)

例1: (明确指定主键,并且有此行记录,row lock)

SELECT * FROM test WHERE id=1 FOR UPDATE;
SELECT * FROM test WHERE id=1 and a=’字段a-行1′ FOR UPDATE;

例2: (明确指定主键,若查无此行记录,无lock)

SELECT * FROM test WHERE id=’-1′ FOR UPDATE;

例3: (无主键,table lock)

SELECT * FROM test WHERE a=’test’ FOR UPDATE;

例4: (主键不明确,table lock)

SELECT * FROM test WHERE id<>2 FOR UPDATE;

例5: (主键不明确,table lock)

SELECT * FROM test WHERE id LIKE ‘%3%’ FOR UPDATE;

MySQL数据库主从分离的配置方法

介绍

MySQL数据库设置读写分离,可以使对数据库的写操作和读操作在不同服务器上执行,提高并发量和响应速度。现在的网站一般大点的,都采用有数据库主从分离、读写分离,既起到备份作用也可以减轻数据库的读写的压力,一直听说过这些,但是从来没有亲自动手实践过,今天有时间实践一下,记录下过程。

环境准备

我准备了两台服务器,一个是本机PC,一个是远程服务器,分别在两台机子上装有Mysql数据库。
MySQL安装我就不介绍了,这里需要注意的是:MySQL安装的版本最好一致,如果不一致,低版本向高版本读的时候可能有问题,最好保持一致。

主库master
服务器:172.10.10.69  CentOS 7 Linux系统 ,  mysql版本  5.6.35

从库slave
本机:172.10.10.240  Win7系统,  mysql版本  5.6.35

主库配置

1、创建用户

在主库中创建一个用户root,用于从库读取主库的执行日志。
需要在mysql命令行里执行,需要先登录命令行

1、GRANTREPLICATIONSLAVEON *.* TO'root'@'192.10.10.240'IDENTIFIEDBY'123456';
2、flush privileges; 

2、修改my.cnf

Linux系统在 /etc/my.cnf中;windows在C:Program FilesMySQLMySQL Server 5.6my.ini中。

在my.cnf文件里增加一下代码

server-id = 1  #数据库ID号
log-bin=master-bin  #启用二进制日志
log-bin-index=master-bin.index  #二进制日志名称

这里注意不要放在文件的末尾,要放在前面,即[mysqld]后,这里放上我的my.cnf内容

[mysqld]
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
max_allowed_packet=100M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

3、查看状态

登陆mysql命令行后,输入show master status,如果出现下面信息代表主库配置完成.

mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |   120 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

记录下File和Position两个内容,从库配置的时候会用到这个。

从库配置

在本机PC(从库)上找到my.cnf(windows上为my.ini)文件,然后添加以下内容,这个配置和主库的配置意思是一样的

server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index

注意确定和主库的位置一样,我就因为位置放置在末尾导致一直关联不上。

1、关联主从库

最后一步很重要,登录从库的MySQL命令行,执行以下代码,主要是关联主库的一些信息。

change master to master_host='192.10.10.69',   #Master 服务器Ip
master_port=3306,
master_user='root',
master_password='123456', 
master_log_file='master-bin.000001',  #Master日志文件名
master_log_pos=120; #Master日志同步开始位置

注意是否执行成功,如果执行失败就好好检查下代码,看看哪里写错了。
如果执行正常,就启动从库slave,并查看下连接状态。

//需要再mysql命令行执行 
start slave; 
show slave status; //查看slave连接状态

状态信息

               Slave_IO_State: Waiting for master to send event
                  Master_Host: 45.78.57.4
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 672913
               Relay_Log_File: slave-relay-bin.000044
                Relay_Log_Pos: 504
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

注意!配置过程中会碰到以下问题:

1、在Mysql5.6.35中,my.ini文件在C:ProgramDataMySQLMySQL Server 5.6目录下面,且已经默认配置了server-id=1,需要注释掉。
2、如果碰到【Slave failed to initialize relay log info structure from the repository】错误提示,需要在slave中执行命令【reset slave;】
3、在命令行中可以通过【show variables like ‘server_id’;】查看server_id信息。
4、修改Mysql配置后,需要重启Mysql服务.
5、下面这两个状态必须为Yes才算成功,如果不是,则检查上面步骤那一步配置错误。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

测试

现在在主库上添加一条数据,看看从库上是否有一个相同的数据,如果有则配置正常,功能使用正常。

主从分离的原理主要是:开启主库的执行日志功能,然后从库读取主库的日志信息,然后将主库执行过的SQL语句在从库上面执行一遍就做到主从分离,主从数据保持一致,起到备份数据的功能。

MySQL性能调优技巧

摘要:针对购物旺季网站流量会对数据库造成的压力,作者给出了MySQL性能调优的一些技巧,这些技巧极具参考价值,通过这些调优,可以有效避免因为流量过大造成服务器宕机,从而给企业造成经济损失。

技巧#1:确定MySQL的最大连接数

对于MySQL的最大连接数,一次最好是发送5个请求到Web服务器。对Web服务器的5个请求中的一部分将用于CSS样式表,图像和脚本等资源。由于诸如浏览器缓存等原因,要获得准确的MySQL到Web服务器的请求比率可能很困难; 要想得到一个确切的数字,就需要分析Web服务器的日志文件。例如,可以手动访问Apache的“access_log”日志文件,也可以通过Analog或Webalizer等实用程序访问日志文件。
一旦有了对特定使用情况的准确估计,请将该比率乘以Web服务器的最大连接数。例如,如果Web服务器配置为最多为256个客户端提供服务,MySQL请求与Web请求的比率为1/8,则最好将最大数据库连接数设置为32。还要考虑留有安全余量,把这个数乘以2,得到最终的数量。只有在基础设施支持的情况下,才能尝试将数据库连接数的最大数量与Web服务器的客户端限制相匹配。在大多数情况下,最好保持接近32。

在Monyog中查看MySQL连接

在MySQL数据库中,MySQL的最大并发连接数是存储在全局变量max_connections中的。Monyog报告变量“max_connections”作为当前连接监控组中的“最大允许”指标。它还将该数字除以打开的连接数,以生成连接使用百分比:
还有一个连接历史记录监控,可以帮助计算最佳的最大并发连接数。它包括尝试,拒绝和成功连接的数量。此外,允许达到的最大指标的百分比显示为一个进度条,可以让你快速评估服务器在过去达到的最大并发连接数:

技巧#2:为临时表分配足够的内存

在某些情况下,服务器在处理语句时会创建内部临时表。临时表用于内部操作如GROUP BY和distinct,还有一些ORDER BY查询以及UNION和FROM子句(派生表)中的子查询。这些都是在内存中创建的内存表。内存中临时表的最大大小由tmp_table_size和max_heap_table_size中较小的值确定。如果临时表的大小超过这个阈值,则将其转换为磁盘上的InnoDB或MyISAM表。此外,如果查询涉及BLOB或TEXT列,而这些列不能存储在内存表中,临时表总是直接指向磁盘。
这种转换的代价很大,所以考虑增加max_heap_table_size和tmp_table_size变量的大小来帮助减少在磁盘上创建临时表的数量。请记住,这将需要大量内存,因为内存中临时表的大小是基于“最坏情况”的。例如,内存表总是使用固定长度的列,所以字符列使用VARCHAR(255)。这可以使内存中的临时表比想象的要大得多—事实上,这比查询表的总大小要大很多倍!当增加max_heap_table_size和tmp_table_sizevariables的大小时,一定要监视服务器的内存使用情况,因为内存中的临时表可能会增加达到服务器内存容量的风险。
一般来说,32M到64M是建议值,从这两个变量开始并根据需要进行调优。

在Monyog中的临时表监测

临时表的监测是许多预定义的Monyog监测之一。它提供了一些临时表使用的指标,包括:

  • 允许的最大值:显示tmp_table_size服务器变量的值,它定义了在内存中创建的临时表的最大大小。与max_heap_table_size一起,这个值定义了可以在内存中创建的临时表的最大大小。如果内存临时表大于此大小,则将其存储在磁盘上。
  • 内存表的最大大小:显示max_heap_table_size服务器变量的值,该值定义了显式创建的MEMORY存储引擎表的最大大小。
  • 创建的临时表总数:显示created_tmp_tables服务器变量的值,它定义了在内存中创建的临时表的数量。
  • 在磁盘上创建的临时表:显示created_tmp_disk_tables服务器变量的值,该变量定义了在磁盘上创建的临时表的数量。如果这个值很高,则应该考虑增加tmp_table_size和max_heap_table_size的值,以便增加创建内存临时表的数量,从而减少在磁盘上创建临时表的数量。
  • 磁盘:总比率:基于created_tmp_disk_tables除以created_tmp_tables的计算值。由于tmp_table_size或max_heap_table_size不足而在磁盘上创建的临时表的百分比。Monyog将这个数字显示为一个进度条和百分比,以便快速确定有多少磁盘用于临时表,而不是内存。

趋势图可用于创建的总表,磁盘上创建的表和磁盘的总比值。这些让我们看到了它们随着时间的演变:

技巧#3:增加线程缓存大小

连接管理器线程处理服务器监听的网络接口上的客户端连接请求。连接管理器线程将每个客户端连接与专用于它的线程关联,该线程负责处理该连接的身份验证和所有请求处理。因此,线程和当前连接的客户端之间是一对一的比例。确保线程缓存足够大以容纳所有传入请求是非常重要的。
MySQL提供了许多与连接线程相关的服务器变量:
线程缓存大小由thread_cache_size系统变量决定。默认值为0(无缓存),这将导致为每个新连接设置一个线程,并在连接终止时需要处理该线程。如果希望服务器每秒接收数百个连接请求,那么应该将thread_cache_size设置的足够高,以便大多数新连接可以使用缓存线程。可以在服务器启动或运行时设置max_connections的值。
还应该监视缓存中的线程数(Threads_cached)以及创建了多少个线程,因为无法从缓存中获取线程(Threads_created)。关于后者,如果Threads_created继续以每分钟多于几个线程的增加,请考虑增加thread_cache_size的值。
使用MySQL show status命令显示MySQL的变量和状态信息。这里有几个例子:

SHOW GLOBAL STATUS LIKE '%Threads_connected%';

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| Threads_connected | 2     |

+-------------------+-------+
SHOW GLOBAL STATUS LIKE '%Threads_running%';

+-----------------+-------+

| Variable_name   | Value |

+-----------------+-------+

| Threads_running | 1     |

+-----------------+-------+

Monyog线程缓存监测

Monyog提供了一个监控线程缓存的屏幕,名为“线程”。与MySQL线程相关的服务器变量映射到以下Monyog指标:

  • thread_cache_size:可以缓存的线程数。
  • Threads_cached:缓存中的线程数。
  • Threads_created:创建用于处理连接的线程。

Monyog线程屏幕还包括“线程缓存命中率”指标。这是一个提示线程缓存命中率的指标。如果值较低,则应该考虑增加线程缓存。在状态栏以百分比形式显示该值;它的值越接近100%越好。
如果这些指标的值等于或超过指定值,则可以将每一个指标配置为发出警告和/或严重警报。

其他相关的服务器变量

除了上述指标以外,还应该监控以下内容:

  • InnoDB缓冲池大小: InnoDB缓冲池大小在使用InnoDB的MySQL数据库中起着至关重要的作用。缓冲池同时缓存数据和索引。它的值应该尽可能的大,以确保数据库使用内存而不是硬盘驱动器进行读取操作。
  • 临时表大小: MySQL使用max_heap_table_size和tmp_table_size中较小的一个来限制内存中临时表的大小。拥有较大的值可以帮助减少在磁盘上创建临时表的数量,但也会增加服务器内存容量的风险,因为这个指标适用于每个客户端。一般来说,32M到64M是建议的值,从这两个变量开始并根据需要进行调优。
  • InnoDB日志缓冲区大小: MySQL每次写入日志文件时,它都会利用可用于处理销售数据的重要系统资源。因此,将InnoDB日志缓冲区大小设置为较大值才有意义。这样,服务器在大型事务中写入磁盘的次数就减少了,从而最大限度地减少了这些耗时的操作。64M是这个变量的一个很好的起点。

结论

虽然即便是最大的公司网站也会因宕机而遭受损失,但这种影响对于处理网上销售的中小型企业尤其关键。根据最近的一份调查报告显示,一分钟的宕机导致企业平均损失约5000美元。不要让你的业务成为那种统计数据(因为宕机造成的损失)的一部分。在假日繁忙之前,主动调优MySQL数据库服务器(S)并收获回报吧!

MySQL笔记之介绍和安装

MySQL版本选择

  1. MySQL5.6以后的版本,推荐使用官方版本。
  2. Percona:在5.6版本以后,MySQL将Percon之前优化集成到官方版本中;
  3. MariaDB:无INNODB;且核心代码较老
  4. MySQL在5.6以后不断重构源码,安装包越来越大,功能和性能在持续改进

MySQL官方网站介绍

官方网站:http://www.mysql.com
1. Developer Zone: MySQL开发工程师板块

  • Articles: Oracle工程师自己的博客
  • Plant MySQL: 和MySQL相关从业人员的博客
  • Bugs:MySQL BugList
  • Worklog:开发记录
  • Labs:MySQL实验性项目

2.Downloads:MySQL下载

  • Enterprise:MySQL企业版本相关,略过
  • Community:社区版,我们下载和使用社区版
    MySQL Community Server:MySQL Server
    MySQL Fabric : 和管理相关的工具
    MySQL Router:路由中间件
    MySQL Utilities:MySQL应用程序包
    MySQL Workbench:官方图型化管理界面
    MySQL Proxy:MySQL代理。Alpha版本,不推荐

3.Documentation:MySQL文档

  • 官方文档 版面更改,下载离线文档在左侧Menu的下面
    PDF A4
    EPUB
    HTML

MySQL下载

  1. 推荐下载Linux-Generic版本
    2.Source Code版本主要作用是为了让开发人员研究源码使用,自己编译对性能提升不明显
    3.不推荐Version 5.5.X,有部分bug
    4.推荐使用Version 5.6.X和Version 5.7.X
    下载地址:
    MySQL Community Server 5.7.9 Linux Generic x86-64bit
    MySQL Community Server 5.6.27 Linux Generic x86-64bit

MySQL安装

  1. 安装通用步骤:
  • 解压缩mysql-VERSION-linux-glibc2.5-x86_64.tar.gz
  • 打开INSTALL_BINARY 文件,按照shell>开头的步骤进行操作
  • 将export PATH=/安装路径/mysql/bin:$PATH添加到/etc/profile
  • chkconfig mysqld on或者chkconfig mysqld.server on视你的环境而定,详细步骤如下

2.MySQL 5.6.X 安装:

shell> yum install libaio # Debain系用户:apt-get install libaio1
shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server

3.MySQL 5.7.X 安装

shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> mkdir mysql-files
shell> chmod 770 mysql-files
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> bin/mysqld --initialize --user=mysql #该步骤中会产生零时
                                            #root@localhost密码
                                            #需要自己记录下来
shell> bin/mysql_ssl_rsa_setup          
shell> chown -R root .
shell> chown -R mysql data mysql-files
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server

4.验证安装

  • data目录在安装之前是空目录,安装完成后应该有ibXXX等文件
  • 安装过程中输出的信息中,不应该含有ERROR信息,错误信息默认会写入到$HOSTNAME.err的文件中
  • 通过bin/mysql命令(5.7.X含有临时密码)可以正常登录
    5.MySQL启动
  • mysqld_safe –user=mysql & 即可启动,mysqld_safe是一个守护mysqld进程的脚本程序,旨在mysqld意外停止时,可以重启mysqld进程
  • 也可以通过INSTALL_BINARRY中的的步骤,使用/etc/init.d/mysql.server start进行启动(启动脚本以你复制的实际名字为准,通常改名为mysqld,即/etc/init.d/mysqld start)

附录
1.模版配置文件my.cnf

[client]
[mysql]
prompt = [\u@\h][\d]>\_
[mysqld]
########basic settings########
server-id = 11 
port = 3306
user = mysql
bind_address = 10.166.224.32   #根据实际情况修改
autocommit = 1   #自动提交
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
datadir = /data/mysql_data      #根据实际情况修改,建议和程序分离存放
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 134217728
tmp_table_size = 67108864
tmpdir = /tmp
max_allowed_packet = 16777216
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16777216
read_rnd_buffer_size = 33554432
sort_buffer_size = 33554432
########log settings########
log_error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
long_query_time = 2
min_examined_row_limit = 100
########replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row 
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
########innodb settings########
innodb_page_size = 8192
innodb_buffer_pool_size = 6G    #根据实际情况修改
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_log_group_home_dir = /redolog/  #根据实际情况修改
innodb_undo_directory = /undolog/      #根据实际情况修改
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
innodb_log_file_size = 4G               #根据实际情况修改
innodb_log_buffer_size = 16777216
innodb_purge_threads = 4
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 67108864 
########semi sync replication settings########
plugin_dir=/usr/local/mysql/lib/plugin      #根据实际情况修改
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
[mysqld-5.7]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on

2.几个重要的参数配置和说明

  • innodb_log_file_size = 4G :做实验可以更改的小点,线上环境推荐用4G,
    以前5.5和5.1等版本之所以官方给的值很小,是因为太大后有bug,现在bug已经修复
  • innodb_undo_logs = 128和innodb_undo_tablespaces = 3建议在安装之前就确定好该值,后续修改比较麻烦
  • [mysqld],[mysqld-5.7]这种tag表明了下面的配置在什么版本下才生效,[mysqld]下均生效
  • autocommit,这个参数在5.5.X以后才有,安装5.6.X的时候要注意先把该参数注释掉,等安装完成后,再行打开, 5.7.X无需预先注释
  • datadir, innodb_log_group_home_dir, innodb_undo_directory一定要注意他的权限是 mysql:mysql

3.my.cnf问题

  • 使用mysqld –help -vv | grep my.cnf查看mysql的配置文件读取顺序
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
  • 后读取的my.cnf中的配置,如果有相同项,会覆盖之前的配置
  • 使用–defaults-files可指定配置文件