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可指定配置文件

VPS建站:Mysql数据库日志大量占用磁盘空间导致速度缓慢

故障记录,仅供参考!使用 Linode vps 完成建站并且使用时间超过一年以上的学员可以检查一下。

最近帮学员解答问题的时候发现有个学员用 Linode 建的网站,网站内容很多,有上百个产品也有不少 blog 文章(做内容营销的)。他反映,用了一年多了,网站的速度最近感觉明显很慢很慢。

重点检查了一下缓存插件,发现是正常的。但是 FQ 访问并操作的时候明显感觉到很慢。

最后发现是 Linode 的磁盘空间快要满了,硬盘空间少会会导致网站速度慢,如果空间已满,还会导致网站无法访问。

检查了一下原因,是因为以前安装 lnmp环境安装包的时候程序默认不关闭 Mysql 的日志文件,导致在 /usr/local/mysql/var/ 下生成了许多名为 mysql-bin.0000* 的日志文件,每一个日志文件的大小都有1G,时间久了会占用硬盘空间。因此我们需要清理这些文件。

首先,xshell 连接 Linode 后,

执行命令查看磁盘空间

df -h

接着会出现类似下面这样的信息:

[root@li1207-110 ~]# df -h
Filesystem      Size  Used  Avail Use%  Mounted on
/dev/sda        20G   15.5G  3.5G  80%  /
tmpfs           493M  192K   493M   1%  /dev/shm

这位学员用的是5美金方案的 Linode,SSD硬盘 20G 容量,已用了 15.5 G 以上。

我们用 XFTP 到 /usr/local/mysql/var/ 下看一下,确实有几个较大的名为 mysql-bin.0000* 的文件。如:mysql-bin.000015,mysql-bin.000016 等等。。

清理 MySQL 日志文件

执行:/usr/local/mysql/bin/mysql -u root -p

接着提示 Enter password:

输入数据库管理员密码(root password of Mysql Database),注意输入的时候是不显示输入状态的,字符不可见。所以你可以在记事本上先写好密码,然后复制,再鼠标右键粘贴进去,粘贴进去的时候也不显示,直接回车即可。

然后会提示:mysql>

未分类

此时复制并执行下面的命令,注意复制的时候要包含分号,粘贴,回车执行。

reset master;

执行完后会提示类似于:“Query OK, 234 rows affected (12.3 sec)”,说明已经成功。

再输入:quit 退出 mysql 命令模式。

此时在 XFTP 窗口中点击刷新按钮,可以看到 /usr/local/mysql/var/ 下的名为 mysql-bin.0000* 的日志文件已经清理掉。(注意其他的文件不要去手动删除)

我们再次执行 df -h 命令。

[root@li1207-110 ~]# df -h
Filesystem     Size   Used  Avail Use%  Mounted on
/dev/sda       20G    8G    10G   42%   /
tmpfs          493M   192K  493M  1%    /dev/shm

可以看到空余了不少磁盘空间。

定期自动清理MySQL日志

用 Xftp 连接打开 VPS 的根目录,找到根目录下的 etc 目录,在该目录下有个名为 my.cnf 的文件。这个文件即为 MySQL 数据库的配置( cnf=Configuration) 文件。

下载(或 vi 命令)用 notepad++ 修改编辑打开它,可以看到这一行:

expire_logs_days = 10

这是代表数据库日志文件过10天就失效并清理。如果你的网站流量很大(或者将来会流量很大),那么即使是 10天产生的日志文件也会很大。

因此我们可以把 10 改成 5。上传覆盖原 my.cnf 文件,然后重启 mysql。

service mysql restart

这样每过 5 天就会自动清理日志。

我们也可以彻底禁用 MySQL 日志。

彻底禁用MySQL日志

修改/etc/my.cnf 文件,找到

log-bin=mysql-bin
binlog_format=mixed

在这两行前面加上#,将其注释掉。上传覆盖原 my.cnf 文件,然后重启 mysql。

未分类

mysql 数据去重

从excel中导入了一部分数据到mysql中,有很多数据是重复的,而且没有主键,需要按照其中已经存在某一列对数据进行去重。

添加主键

由于之前的字段中没有主键,所以需要新增一个字段,并且将其作为主键。

添加一个新的字段id,对id中的值进行递增操作,然后再设置为主键。

对id字段进行递增的赋值操作如下:

SET @r:=0;
UPDATE table SET id=(@r:=@r+1);

然后设置为主键即可。

去重

添加玩递增的id字段后,就可以对数据根据某个字段进行去重操作,策略就是保存id最小的那条数据。

DELETE FROM `table`
WHERE
`去重字段名` IN (
    SELECT x FROM
    (
        SELECT `去重字段名` AS x 
        FROM `table` 
        GROUP BY `去重字段名` 
        HAVING COUNT(`去重字段名`) > 1
    ) tmp0
)
AND 
`递增主键名` NOT IN (
    SELECT y FROM
    (
        SELECT min(`递增主键名`) AS y 
        FROM `table` 
        GROUP BY `去重字段名` 
        HAVING COUNT(`去重字段名`) > 1
    ) tmp1
)

Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机

一、最终环境

Ubuntu17.10、Apache2.4.27、MySQL5.7.20、PHP7.1.8

二、安装 apache

官方源有,直接安装:

sudo apt-get install apache2

三、安装 mysql

官方源有,直接安装:

sudo apt-get install mysql-server

安装期间会提示设置 MySQL administrator 的密码

============================================

PS:需要什么软件或包,直接用 apt-cache 搜索

apt-cache search <关键词>

确认包名后,直接用 apt-get install 安装。

四、安装 php

官方源有 php7.1,直接安装:

sudo apt-get install php7.1 php7.1-dev

注意带上版本号,不然默认安装 7.x。php7.1 是主程序,php7.1-dev 是 7.1 版的开发包(有 phpize、php-config 等等,phpize 可以为 已编译好的 php 加载外挂模块,php-config 可以获得 php 的详细配置)。

============================================

如果要装 php5.6 的话,推荐这个 PPA 源:ppa:ondrej/php。这个源有 php5.6 和 php7.x 以及绝大多数的 php 扩展,包括 redis、memcache、mongodb 等等。

添加 ppa:ondrej/php 源:

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

安装 php5.6:

sudo apt-get install php5.6 php5.6-dev

五、重启 apache

sudo /etc/init.d/apache2 restart

更多选项:

Usage: apache2 {start|stop|graceful-stop|restart|reload|force-reload}

六、检查 apache

访问 http://localhost/。这是 apache 服务器的默认页在 /var/www/html 下,里面还介绍了 apche 的相关配置文件。

未分类

七、检查 mysql

终端输入 mysql,跟着打两个 Tab,看到所有有关 mysql 的命令包:

mingc@mingc-GE60-2PL:~$ mysql
mysql                      mysql_install_db
mysqladmin                 mysqloptimize
mysqlanalyze               mysql_plugin
mysqlbinlog                mysqlpump
mysqlcheck                 mysqlrepair
mysql_config_editor        mysqlreport
mysqld                     mysql_secure_installation
mysqld_multi               mysqlshow
mysqld_safe                mysqlslap
mysqldump                  mysql_ssl_rsa_setup
mysqldumpslow              mysql_tzinfo_to_sql
mysql_embedded             mysql_upgrade
mysqlimport               

输入 mysql -u<你的账号> -p ,回车,输入密码,进入 mysql:

mingc@mingc-GE60-2PL:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 73
Server version: 5.7.20-0ubuntu0.17.10.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql>

八、检查 php

php -v

不出意外的话,应该显示 php 的版本

============================================

也可以查看 apache 和 mysql 版本:

apache2 -v
mysql -V

九、创建 php 探针

sudo vim /var/www/html/info.php

添加如下内容:

<?php
phpinfo();

改变所有者:

sudo chown www-data:www-data /var/www/html/info.php

访问 http://localhost/info.php,得到有关 PHP 的详细页面。

未分类

十、安装 phpmyadmin

sudo apt-get install phpmyadmin

安装期间,

询问要连接的服务器,选择 apache2;

询问创建 phpmyadmin 的数据库,选择“是”;

询问设置登录 phpmyadmin 的用户和密码。

然后浏览器访问:http://localhost/phpmyadmin

未分类

十一、安装 redis 服务和 redis 扩展

官方源有,直接安装:

(1)redis 服务器

sudo apt-get install redis-server

期间,一些需要的工具包也会自动安装。安装好后,默认自启动、后台运行,配置文件在 /etc/redis 目录下。

(2)php 的 redis 扩展模块

sudo apt-get install php-redis

其他的扩展也可以这么装,利用 apt-cache search 搜索包名,再用 apt-get install 安装。

重启 apche, sudo /etc/init.d/apache2 restart

访问 http://localhost/info.php,确认 redis 扩展:

未分类

测试一下:

终端输入 redis-,跟着打两个 Tab 键,看到有关 redis 的命令和工具:

mingc@mingc-GE60-2PL:~$ redis-
redis-benchmark  redis-check-rdb  redis-server    
redis-check-aof  redis-cli

redis-cli 是 访问 redis-server 的客户端接口,执行 redis-cli 即可登录到 redis 服务器:

mingc@mingc-GE60-2PL:~$ redis-cli
127.0.0.1:6379>

更多 redis-cli 的命令选项,使用 redis-cli –help 查看。

再写一段 php 脚本测试一下, vim /var/www/html/test_redis.php

内容如下:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
echo "Server is running: " . $redis->ping(); 

十二、安装 mysql 扩展

在上面的 http://localhost/info.php 里可以看到,没有 mysql 扩展。虽说 php7 弃用了 mysql 扩展,但有些旧项目还是需要的。装一下 mysql 扩展。

这里选择编译安装(通过 apt 安装的 php-mysql 扩展,如果是 php7.x,那就是装 pdo 和 pdo_mysql 扩展)

(1)直接从 PECL 官方站 搜索 mysql,找到 MySQL 扩展的 页面 ,点击页面的 [ Browse Source ],选择最新的 commit、下载 tar.gz 包。我下载后的包名为 mysql-fae9884.tar.gz。

(2)编译安装:

tar -xf mysql-fae9884.tar.gz
cd mysql-fae9884
phpize
./configure --with-php-config=/usr/bin/php-config
sudo make && sudo make install

前面装 php7.1 的时候,也装了 php7.1-dev,这里面就有 phpize 和 php-config。而 –with-php-config 是 php-config 程序(命令)的位置,可以使用 whereis php-config 查看。

编译安装成功后,会有成功提示 和 mysql 扩展模块(.so 文件)的路径:

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/lib/php/20160303/  

然后,编辑 php 用于 apache 的配置文件 /etc/php/7.1/apache2/php.ini,在最后添加一行:

extension=mysql.so

重启 apache, sudo /etc/init.d/apache2 restart

访问 http://localhost/info.php,确认下有了 mysql 扩展。

未分类

写一段 php 脚本测试: vim /etc/www/html/test_mysql.php

内容如下:

<?php
$mysql = mysql_connect('127.0.0.1', 'root', 'root');
if(!$mysql) {
    die(mysql_error($mysql));
}
echo 'Ok' . "rn";

由于 mysql 模块是手动编译安装的,所以默认不会进入 php 的命令行配置。

下面把 mysql 模块加入到 php 的 cli(命令行) 配置,让 php 的命令行模式也支持 mysql 模块:

sudo vim /etc/php/7.1/mods-available/mysql.ini

编辑内容如下:

extension=mysql.so

建立符号链接:

sudo ln -s /etc/php/7.1/mods-available/mysql.ini /etc/php/7.1/cli/conf.d/mysql.ini

检查一下,确认 php 命令行模式启用了 mysql 扩展模块:

php -m | grep mysql  

十三、开启 php 和 apache 的错误提示

默认不显示 php 错误,下面开启。

(1)修改 php 的配置文件,在 /etc/php/7.1/apache2 下,打开 php.ini。

(2)搜索 display_errors = Off,修改为 On

(3)搜索 error_reporting = E_ALL & ~E_NOTICE,修改为 E_ALL | E_STRICT(搜不到的话就搜短一点:“error_reporting =”)。

(4)修改 apache 的配置文件,在 /etc/apache2 下,打开 apache.conf。

(5)文件最后添加两行:

php_flag display_errors        on
php_value error_reporting       2039

(6)重启 apache:

sudo /etc/init.d/apache2 restart

十四、创建虚拟主机

创建虚拟主机自然用 apache 配置,了解一下 apache 的配置目录:

/etc/apache2
├── apache2.conf      # 主配置文件,其他的一些配置文件通过 Include 指令包含进来
├── conf-available    # 所有可用的配置文件(里面的 *.conf 文件内容几乎都被默认注释了)
├── conf-enabled      # 可用的配置文件中,启用了哪些,一般都是符号链接、指向上面的 conf-available 目录里每个 *.conf 文件
├── envvars           # 环境变量
├── magic
├── mods-available    # 所有可用的模块
├── mods-enabled      # 哪些模块被启用了
├── ports.conf        # 定义端口监听
├── sites-available   # 重点来了:所有可用的站点
└── sites-enabled     # 哪些站点被启用了

步骤简单,就是在 sites-available 目录定义站点配置文件,然后在 sites-enabled 里建立指向这个配置文件的符号链接。

(1)建配置

cd /etc/apache2/sites-available/
sudo cp 000-default.conf my.site.conf
vim my.site.conf

修改如下(注意别把注释与指令行放在一行,不然会有语法错误;精简版在后面):

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    # 域名
    ServerName my.site
    # 域名别名,可以设置多个,空格隔开
    ServerAlias my.site

    ServerAdmin webmaster@localhost

    # 站点根目录
    DocumentRoot /var/www/my.site
    <Directory "/var/www/my.site/">
        # 启用符号链接
        Options FollowSymLinks

        DirectoryIndex index.php index.html index.htm

        # 注意这个配置,会影响本地目录下的 .htaccess 的启用
        AllowOverride All

        Order deny,allow
        Allow from All

        # 限制访问目录,多个目录用冒号隔开
        # php_admin_value open_basedir "/var/www/my.site/:/tmp:/usr/lib/php/"
    </Directory>

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

精简版(去掉了多余注释):

<VirtualHost *:80>
    ServerName my.site
    ServerAlias my.site
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/my.site
    <Directory "/var/www/my.site/">
        Options FollowSymLinks
        DirectoryIndex index.php index.html index.htm
        AllowOverride All
        Order deny,allow
        Allow from All
        # php_admin_value open_basedir "/var/www/my.site/:/tmp:/usr/lib/php/"
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

(2)建符号链接

sudo ln -s /etc/apache2/sites-available/my.site.conf /etc/apache2/sites-enabled/my.site.conf

(3)检查语法

终端执行:

apachectl configtest

(4)添加 hosts 解析

vim /etc/hosts ,添加一行:

127.0.0.1   my.site

(5)重启 apache

sudo /etc/init.d/apache2 restart

然后,按照配置的站点目录 /etc/www/my.site,创建目录和测试文件:

sudo makedir -p /etc/www/my.site
cd /etc/www/my.site/
sudo echo "<h2>Welcome to my.site!</h2>" > index.html

浏览器访问 http://my.site,

未分类

OK,完成~~

十五、相关链接

PHP 及扩展的 PPA 源:https://launchpad.net/~ondrej/+archive/ubuntu/php/+index?batch=75&memo=75&start=75

在阿里云上通过Ubuntu+uwsgi+nginx+mysql部署Flask(新手向)

0. 前言

这其实也是你所看到的这个网站的部署方式。

老规矩,上环境。截至2017年11月:

Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-62-generic x86_64)

uwsgi –version 2.0.15

nginx version: nginx/1.10.3 (Ubuntu)

supervisord -v 3.2.0

而我的个人电脑是

4.13.12-1-ARCH x86_64 GNU/Linux

1. 创建Ubuntu并创建新用户

在阿里云购买好ECS,我选择的最便宜的1核那个,一年300多,买完之后在控制台可以选择系统,选择好后输入root用户的密码。

未分类

随后会告诉你一个网页上可以连接到服务器的密码,你得记住。随后在网页上登录到服务器。键入

adduser edison

创建一个新用户,当然了用户名你自己取,这里是我的名字。

随后在我的电脑上用ssh连接服务器,这样方便操作些,此处怎么ssh连接服务器就不说了,百度谷歌一大把。

此处先用

ssh root@ip 

来连接。会提示加入密钥回车就好,然后输入你root也就是刚开始创建云盘时的那个密码。就连接成功了。

输入

nano /etc/sudoers

为新创建的用户加入sudo权限:

未分类

输入

apt-get update

更新索引,这里如果比较慢的话可以替换成中科大的源,如何替换百度谷歌就好也很简单。随后开始安装必要的软件。

2.安装python3和git

先安装python3

apt install python3-pip

随后使用pip3安装虚拟环境模块

pip3 install virtualenv

此时可以切换至edison这个新用户。

ssh edison@ip

我是把网站放在了github上,之后更新程序也方便管理。所以这里安装git

未分类

这里发现提示了

sudo: unable to resolve host:xxx

的信息,不影响使用的。可以通过修改hosts文件解决

未分类

未分类

输入y然后回车继续安装git。

在/home/edison下新建目录blog,在blog下git clone把源代码拷下来。

创建虚拟环境:

未分类

注意这里的虚拟环境使用的python3版本。

可以通过启动虚拟环境查看,确实是py3:

未分类

在blog下再新建一个logs文件夹。此时blog应该有三个文件夹,其他两个一个是venv文件夹一个是你的程序的文件夹。

未分类

3. 安装nginx

输入

sudo apt-get install nginx

安装nginx。输入

sudo /etc/init.d/nginx start

启动服务,shell会显示ok提示启动nginx服务成功。这时候打开浏览器,直接输入你的ECS服务器的公网ip就可以看到

未分类

就说明nginx启动成功。接下来用一个小的flask程序进行小小的演示。

创建一个test.py:

未分类

然后在虚拟环境下(根据前文,这时候已经在虚拟环境中了,可以从下图的shell里第一行的前面的venv字眼看出)

pip3 install flask

安装flask模块。

4. 安装uwsgi和supervisor并配置

接下来安装

pip install uwsgi

未分类

然后(此时所在文件夹是blog里)新建一个uwsgi的配置文件,并编辑以下内容,然后启用uwsgi:

未分类

未分类

未分类

可以看到uwsgi已经在运行了。这时候ctrl+c退出uwsgi。

接下来安装supervisor后进入配置文件夹,新建一个文件并输入:

sudo apt-get install supervisor
cd /etc/supervisor/conf.d
sudo nano blogSupervisor.conf

未分类

然后输入

sudo service supervisor start

开启进程管理。

5. 配置nginx

进入/etc/nginx/sites-available/,编辑里面default文件,其中内容是:

未分类

然后输入

sudo service nginx restart

重启nginx服务器。打开浏览器输入你的公网ip,就能看到

Hello World! 啦

未分类

这里部署就基本完了,只要把上述的配置文件里提到test这个py文件替换成你的文件,例如manage.py就好了。

6. Mysql和后续

接下来简单说说怎么使用mysql:

安装pymysql,在config.py里使用

“mysql+pymysql://root:xxx@localhost:3306/xxxxx”

的方式启用mysql。

p.s

在使用mysql上尝试了很多方法,但是由于ubuntu的系统python是2,而虚拟环境中python为3,所有总有一些包安装不上,特别是mysqldb的问题,只能使用mysql+pymysql的方法。但是很奇怪的现象是,我的archlinux默认的python是3.6,使用的mariadb,但是不用pymysql也能连接上mysql,而且:

$ python                                                           
Python 3.6.3 (default, Oct 24 2017, 14:48:20) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> 

百思不得其解,如果有缘人看到了这里希望能给出答复。