auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
#CentOS6系统分32位和64位的,要注意是否有lib64(或者32)/security/pam_userdb.so这个认证文件
• vim /etc/vsftpd/vsftpd.conf
#将anonymous_enable=YES 改为 anonymous_enable=NO
#将#anon_upload_enable=YES 改为 anon_upload_enable=NO
#将#anon_mkdir_write_enable=YES 改为 anon_mkdir_write_enable=NO
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
•yum install -y lftp #Linux安装ftp客户端软件
#若不正常查看日志/var/log/messages和/var/log/secure
# windows下安装filezilla客户端软件,进行测试
第一种方案:xshell新建会话,协议改为SFTP,其他的往常改动,然后登陆,输入设置的虚拟用户密码,get到的文件会放会话属性的SFTP-->自定义的本地文件夹
15.5 使用pure-ftpd搭建ftp服务
#使用pure-ftpd搭建比vsftpd搭建要简单
pure-ftpd搭建ftp
1、安装pure-ftpd包(需要epel扩展源)
•yum install -y epel-release
• yum install -y pure-ftpd
2、编辑pure-ftpd配置文件
• vim /etc/pure-ftpd/pure-ftpd.conf
#找到pureftpd.pdb这行,把行首的#删除
(pureftpd.pdb是密码文件)
3、关闭vsftpd服务,开启pure-ftpd服务(因为都是监听21端口的)
• systemctl stop vsftpd
• systemctl start pure-ftpd
4、创建给pure-ftp的用户使用的目录
• mkdir /data/ftp
5、创建一个普通用户pure-ftp
• useradd -u 1010 pure-ftp
6、将/data/ftp的属主权限改为pure-ftp
• chown -R pure-ftp:pure-ftp /data/ftp
7、创建pure-ftp用户
• pure-pw useradd ftp_usera -u pure-ftp -d /data/ftp
#useradd指定创建用户名,-u指定系统用户,-d指定用户家目录;然后设置密码
[root@xinlinux-03 testuser1]# pure-pw useradd ftp_usera -u pure-ftp -d /data/ftp
Password:
Enter it again:
8、将用户密码转化成计算机识别的二进制文件
• pure-pw mkdb
测试:
touch /data/ftp/123.txt
lftp ftp_usera@127.0.0.1
ls
pure-pw用法:
pure-pw list #列出所有的用户
pure-pw userdel #删除用户
pure-pw usermod #更改用户权限属性
pure-pw passwd #更改用户密码
pure-pw mkdb #转化用户密码文件
15.6扩展
vsftp使用mysql存放虚拟用户并验证 http://www.aminglinux.com/bbs/thread-342-1-1.html
ftp的主动和被动模式 http://www.aminglinux.com/bbs/thread-961-1-1.html
15.7课堂笔记
一、mysql操作
show variables 后面加like(类似grep的用法)模糊匹配
show processlist;(很重要)
#查看目前的进程数(一般情况数量在10多个左右,几十个说明mysql很忙,可能是哪里堵塞了 )
二、mysql用户管理
#grant授权时即使添加ALL权限,也没有授权的权限,grant授权权限是root用户特有的(也可设置普通用户拥有授权权限https://www.cnblogs.com/aguncn/p/4313724.html)
对象的owner将权限赋予某个用户(如:testuser1)
grant select ,update on bd_corp to testuser1 [with grant option ]
1.如果带了 with grant option
那么用户testuser1可以将select ,update权限传递给其他用户( 如testuser2)
grant select,update on bd_corp to testuser2
2.如果没带with grant option
那么用户testuser1不能给testuser2授权
#简单的说就是将权限传递给第三方
授权表使用举例
#grant用于给增加用户和创建权限,revoke用于删除用户权限。
下面是一些用grant增加用户和创建权限的例子:
mysql> grant all privileges on *.* to test@localhost identified by 'test' with grant option;
#这句增加一个本地具有所有权限的test用户(超级用户),密码是test。ON子句中的*.*意味着"所有数据库、所有表"。with grant option表示它具有grant权限。
mysql> grant select,insert,update,delete,create,drop privileges on test.* to test1@'192.168.1.0/255.255.255.0' identified by 'test';
#这句是增加了一个test1用户,口令是test,但是它只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限。
用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。
给用户创建权限还可以通过直接修改授权表:
mysql> insert into user
values("localhost","test",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y");
mysql> flush privileges;
这两句和上面第一句grant的效果是一样的,也是增加了一个本地的test超级用户。我们看到用grant方便多了,而且还不需flush privileges。
mysql> insert into user (host,user,password) values("192.168.1.0/255.255.255.0","test1",PASSWORD("test")); mysql> insert into db values("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N") mysql> flush privileges;
#这三句和上面第二句grant的效果也是一样的,也是增加了一个只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限的test1用户,口令是test。要取消一个用户的权限,使用revoke语句。revoke的语法非常类似于grant语句,除了to用from取代并且没有identified by和with grant option子句,下面是用revoke删除用户权限的例子:
mysql> revoke all on test.* from test1@'192.168.1.0/255.255.255.0';
这句revoke就撤消了上面第二句grant创建的权限,但是test1用户并没有被删除,必须手工从user表删除:
mysql> delete from user where user='test1';
mysql> flush privileges;
这样,test1用户就彻底删除了。
三、mysql的备份与恢复
#mysqldump只适用于数据量较小的数据库,当数据量高达上百G等便不适用
#XtraBackup有两个工具,xtrabackup和innobackex:
xtrabackup本身只能备份innoDB和XtraDB,不能备份MyISAM;
innobackex 本事是Hot Backup 脚本修改而来,同时可以备份MuISAM和innoDB,但是备份innoDB需要加读锁。
四、innobackupex备份
#增量备份之前必须要先进行一次全量备份
#第一次增量备份需要指定全量备份的时间戳目录
第二次增量备份需要指定上次增量备份的时间戳目录即可;
五、扩展
1、mysql5.7root密码更改
#mysql5.7root有默认密码,需要重设密码才能进行mysql操作
设置root密码的步骤:
一、查看默认密码
[root@localhost src]# cat /root/.mysql_secret
# The random password set for the root userat Fri Jan 10 20:00:34 2014 (local time): aJqZsA2m
这里的aJqZsA2m就是生成的root随机密码啦
二、登录mysql
[root@localhost src]# mysql -u root -p
Enter password:
输入上面的密码aJqZsA2m登录,如果你没有把mysql的路径加到path里,那就用绝对路径,mysql -u root -p还可以写成mysql -uroot -paJqZsA2m
三、更改密码
mysql> SET PASSWORD FOR 'root'@localhost = PASSWORD('123456');
Query OK, 0 rows affected (0.17 sec)
至此,就成功地修改了密码。
2、MyISAM引擎与InnoDB的优劣(面试可能问到)
主要区别:
1、 MyISAM不支持外键,InnoDB支持外键
2、MyISAM锁表时锁的是整张表,而InnoDB只能锁一条记录
3、MyISAM不支持事务,InnoDB支持事务
4、使用select count(*)时MyISAM最快,因为会记录和保存到内存里;而InnoDB,每次select都会从头到尾去计算,所有会很慢
5、存储结构 MyISAM每张表都存放在三个文件(frm、MYD、MYI)里面,而InnoDB所有的表都保存在同一个数据文件或者多个文件中(不是三个)
6、存储空间 MyISAM可悲压缩,存储空间较小;InnoDB相对MyISAM较大一点,因为要建立缓冲池优化存取速度。
7、移植性:MyISAM数据以文件形式存在,可直接复制粘贴拷贝;InnoDB数据存储到专门的表空间文件,无法复制粘贴拷贝
|
MyISAM
|
InnoDB
|
存储结构
|
每张表被存放在三个文件:
- frm-表格定义
- MYD(MYData)-数据文件
- MYI(MYIndex)-索引文件
|
所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB
|
存储空间
|
MyISAM可被压缩,存储空间较小
|
InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引
|
可移植性、备份及恢复
|
由于MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作
|
免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了
|
事务安全
|
不支持 每次查询具有原子性
|
支持 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表
|
AUTO_INCREMENT
|
MyISAM表可以和其他字段一起建立联合索引
|
InnoDB中必须包含只有该字段的索引
|
SELECT
|
MyISAM更优
|
|
INSERT
|
锁表锁整张表
|
InnoDB更优(锁表时只能锁一条记录)
|
UPDATE
|
|
InnoDB更优
|
DELETE
|
|
InnoDB更优 它不会重新建立表,而是一行一行的删除
|
COUNT without WHERE
|
MyISAM更优。因为MyISAM保存了表的具体行数
|
InnoDB没有保存表的具体行数,需要逐行扫描统计,就很慢了
|
COUNT with WHERE
|
一样
|
一样,InnoDB也会锁表
|
锁
|
只支持表锁
|
支持表锁、行锁 行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
|
外键
|
不支持
|
支持
|
FULLTEXT全文索引
|
支持
|
不支持 可以通过使用Sphinx从InnoDB中获得全文索引,会慢一点
|
3、mysql配置文件
max_connections最大数一般100就足够了,
max_allowed_packet #做数据恢复的时候可能用到
4、mysql调优
MySQL调优可以从几个方面来做:
一、架构层:
做从库,实现读写分离;
二、系统层次:
增加内存;
给磁盘做raid0或者raid5以增加磁盘的读写速度;
可以重新挂载磁盘,并加上noatime参数,这样可以减少磁盘的i/o;
三、MySQL本身调优:
(1) 如果未配置主从同步,可以把bin-log功能关闭,减少磁盘i/o
(2) 在my.cnf中加上skip-name-resolve,这样可以避免由于解析主机名延迟造成mysql执行慢
(3) 调整几个关键的buffer和cache。调整的依据,主要根据数据库的状态来调试。
四、用层次:
查看慢查询日志,根据慢查询日志优化程序中的SQL语句,比如增加索引(增加索引很重要)
五、调整几个关键的buffer和cache
1) key_buffer_size 首先可以根据系统的内存大小设定它,大概的一个参考值:1G以下内存设定128M;2G/256M; 4G/384M;8G/1024M;16G/2048M.这个值可以通过检查状态值Key_read_requests和 Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。注意:该参数值设置的过大反而会是服务器整体效率降低!
2) table_open_cache 打开一个表的时候,会临时把表里面的数据放到这部分内存中,一般设置成1024就够了,它的大小我们可以通过这样的方法来衡量: 如果你发现 open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
3) sort_buffer_size 查询排序时所能使用的缓冲区大小,该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 4 = 400MB。所以,对于内存在4GB左右的服务器推荐设置为4-8M。
4) read_buffer_size 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
5) join_buffer_size 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
6) myisam_sort_buffer_size 这个缓冲区主要用于修复表过程中排序索引使用的内存或者是建立索引时排序索引用到的内存大小,一般4G内存给64M即可。
7) query_cache_size MySQL查询操作缓冲区的大小,通过以下做法调整:SHOW STATUS LIKE ‘Qcache%’; 如果Qcache_lowmem_prunes该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。如果该值非常大,则表明经常出现缓冲不够的情况,需要增加缓存大小;Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,我们可以根据实际情况做出调整。一般情况下4G内存设置64M足够了。
8) thread_cache_size 表示可以重新利用保存在缓存中线程的数,参考如下值:1G —> 8 2G —> 16 3G —> 32 >3G —> 64
除此之外,还有几个比较关键的参数:
9) thread_concurrency 这个值设置为cpu核数的2倍即可
10) wait_timeout 表示空闲的连接超时时间,默认是28800s,这个参数是和interactive_timeout一起使用的,也就是说要想让wait_timeout 生效,必须同时设置interactive_timeout,建议他们两个都设置为10
11) max_connect_errors 是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。与性能并无太大关系。为了避免一些错误我们一般都设置比较大,比如说10000
12) max_connections 最大的连接数,根据业务请求量适当调整,设置500足够
13) max_user_connections 是指同一个账号能够同时连接到mysql服务的最大连接数。设置为0表示不限制。通常我们设置为100足够
5、mysqldump和binlog备份恢复某个库/表(要了解)
#binlog是实时记录数据
mysqldump备份时可以使用,避免过程中全局锁表导致
https://blog.csdn.net/lilongsy/article/details/74726002
mysqldump全量备份+mysqlbinlog二进制日志增量备份
从mysqldump备份文件恢复数据会丢失掉从备份点开始的更新数据,所以还需要结合mysqlbinlog二进制日志增量备份。确保my.ini或者my.cnf中包含下面的配置以启用二进制日志,或者mysqld —log-bin:
[mysqld]
log-bin=mysql-bin
mysqldump命令必须带上–flush-logs选项以生成新的二进制日志文件:
mysqldump --single-transaction --flush-logs --master-data=2 > backup.sql
这样生成的增量二进制日志文件比如为mysql-bin.000003,那么恢复数据时如下:
shell> mysql -uroot -pPwd < backup_sunday_1_PM.sql
shell> mysqlbinlog mysql-bin.000003 | mysql -uroot -pPwd
此外mysqlbinlog还可以指定–start-date、–stop-date、–start-position和–stop-position参数,用于精确恢复数据到某个时刻之前或者跳过中间某个出问题时间段恢复数据,直接摘录MySQL文档说明中相关内容如下:
5.9.3.1. 指定恢复时间
对于MySQL 4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午10:00(今天是2005年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:
mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd
#该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:
mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd \
#在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。
5.9.3.2. 指定恢复位置
也可以不指定日期和时间,而使用mysqlbinlog的选项--start-position和--stop-position来指定日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法,特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号,可以运行mysqlbinlog寻找执行了不期望的事务的时间范围,但应将结果重新指向文本文件以便进行检查。操作方法为:
mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00" \
/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
#该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后,你应从命令行输入下面内容:
mysqlbinlog --stop-position="368312" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd
mysqlbinlog --start-position="368315" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd \
#上面的第1行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句,恢复的数据和相关MySQL日志将反应事务执行的原时间。
6、mysqldump --master-data=2 --single-transaction
1、mysqldump到处数据主要有两种控制:一种导出的全过程加锁lock-tables,另一种是不加。前者在导出开始时执行FLUSH TABLES WITH READ LOCK;也就是全局读锁,会阻塞其他写操作,以保证导出是一致性的;因此只有在导出测试数据时或导出时没有业务连接操作时可不加lock-all-tables。
2、single-transaction和lock-all-tables选项是二选一的,前者是在导出开始时设置事务隔离状态并使用一致性快照开始事务,而后马上unlock tables,然后执行导出,导出过程不影响其他事务或业务连接,但只支持类似InnoDB多版本特性的引擎,因为必须保证导出期间其他操作(事务点t2)改变了数据,而导出时仍能取出导出开始的事务点t1时的数据。而lock-all-tables则是一开始就加全局读锁,知道dump完成。
3、master_data选项开启时默认打开lock-all-tables,同时实现了两个功能,一个加锁,一个取得log信息。
#master_data取1和2的区别在于后者把change master 命令注释起来了,实际意义不大
4、master_data和single-transaction同时使用时,现价全局读锁,然后设置事务一致性和使用一致性快照开始事务,然后马上就取消锁,然后执行导出
7、mysql字符集调整(了解)
#字符乱码问题就需要调整
mysql编译安装时,指定字符集的方法:
./configure --with-charset=utf8
mysql的字符集有4个级别的默认设置:服务器级、数据库级、表级和字段级
一、服务器级三种指定字符集方法:
1、可以在my.cnf中设置:
[mysql]
### 默认字符集为utf8
default-character-set=utf8
2、### (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)
init_connect='SET NAMES utf8'
3、在启动选项中指定:
mysqld --default-character-set=utf8
#如果没有特别的指定服务器字符集,默认使用latin1(ISO-8859-1的别名)作为服务器字符集。上面三种设置的方式都只指定了字符集,没有去做校对,我们可以用show variables like 'char%';命令查询当前服务器的字符
集和校对规则。
注:如果增加default-character-set=utf8后,MYSQL启动报错。可以用character_set_server=utf8来取代default-character-set=utf8,就能正常启动了。这是因为MYSQL不同版本识别的问题。
二、数据库级
创建数据库时指定字符集
mysql>CREATE DATABASE my_db default charset utf8 COLLATE utf8_general_ci;
#注意后面这句话 "COLLATE utf8_general_ci",大致意思是在排序时根据utf8编码格式来排序
#如果指定了数据库编码,那么在这个数据库下创建的所有数据表的默认字符集都会是utf8了
修改MYSQL数据库编码
mysql>ALTER DATABASE my_db DEFAULT CHARACTER SET utf8;
#将MYSQL的my_db数据库的编码设为utf8
三、表级
创建表时指定字符集
mysql>create table my_table (name varchar(20) not null default '')type=myisam default charset utf8;
#这句话就是创建一个表,指定默认字符集为utf8
修改MYSQL表的编码:
ALTER TABLE my_table DEFAULT CHARACTER SET utf8;
以上命令就是将一个表my_table的编码改为utf8
四、字段级
修改字段的编码:
ALTER TABLE `test` CHANGE `name` `name` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
#将MYSQL数据库test表中name的字段编码改为utf8