第十四、十五章NFS和FTP的搭建与配置

14.1 NFS介绍
14.2 NFS服务端安装配置
14.3 NFS配置选项
14.4 exportfs命令
14.5 NFS客户端问题
15.1 FTP介绍
15.2/15.3 使用vsftpd搭建ftp
15.4 xshell使用xftp传输文件
15.5 使用pure-ftpd搭建ftp服务
15.6扩展
 
14.1 NFS介绍
#NFS文件系统是基于网络层面,需要通过网络实现数据的同步
 
 
 
#NFS服务端给NFS客户端提供服务需要借助RPC协议rpcbind服务(CentOS6开始的叫法,CentOS5及之前叫portmap服务),实现通信
#NFS不监听任何端口;最终实现TCP/IP通信的过程是由RPC监听111端口实现的
 

 

NFS传输过程:先由服务端的NFS服务在RPC服务商注册一个端口,然后服务端的RPC服务通过TCP/IP将注册的端口号告知客户端的RPC服务,最后NFS客户端通过与NFS服务端注册的端口进行通信,实现数据传输。
 
 
14.2 NFS服务端安装配置
给服务端安装NFS
1、下载nfs-utils安装包
yum install -y nfs-utils rpcbind
 
2、修改exports文件,增加一行
vim /etc/exports 
#加入如下内容
/home/nfstestdir     192.168.233.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
#设置分享目录、分享ip或者ip段,目录与ip用空格隔开
 
3、创建分享目录,加上777权限
mkdir /home/nfstestdir
chmod 777 /home/nfstestdir
 
4、启动并设置开机自启rpcbind服务和nfs服务
• systemctl start rpcbind
• systemctl start nfs
• systemctl enable rpcbind
• systemctl enable nfs
 
 
14.3 NFS配置选项
配置exports文件增加行内小括号可加的参数说明:
#多个参数间用","逗号隔开
rw 读写
ro 只读
sync 同步模式,内存数据实时写入磁盘
async 非同步模式
no_root_squash 客户端挂载NFS共享目录后,root用户不受约束,权限很大
root_squash 与上面选项相对,客户端上的root用户收到约束,被限定成某个普通用户
all_squash 客户端上所有用户在使用NFS共享目录时都被限定为一个普通用户
anonuid/anongid 和上面几个选项搭配使用,定义被限定用户的uid和gid
 
客户端挂载nfs
1、下载nfs-utils包
yum install -y nfs-utils
 
2、 查看远程服务端共享情况(共享目录和允许访问的ip)
showmount -e 192.168.233.150
[root@xinlinux-01 ~]# showmount -e 192.168.233.150
Export list for 192.168.233.150:
/home/nfstestdir 192.168.233.0/24
 
3、挂载nfs
mount -t nfs 192.168.233.150:/home/nfstestdir /mnt
#mount -t nfs  远程ip:共享目录  挂载目录
 
4、查看挂载是否成功
df -h
[root@xinlinux-01 ~]# mount -t nfs 192.168.233.150:/home/nfstestdir /mnt
[root@xinlinux-01 ~]# df -h
文件系统                          容量  已用  可用 已用% 挂载点
/dev/sda3                          28G  1.2G   27G    5% /
devtmpfs                          481M     0  481M    0% /dev
tmpfs                             492M     0  492M    0% /dev/shm
tmpfs                             492M  7.4M  485M    2% /run
tmpfs                             492M     0  492M    0% /sys/fs/cgroup
/dev/sda1                         197M  112M   85M   57% /boot
tmpfs                              99M     0   99M    0% /run/user/0
192.168.233.150:/home/nfstestdir   28G  4.5G   24G   16% /mnt
 
 
测试:
• touch /mnt/123.txt
ls -l /mnt/123.txt 
#可以看到文件的属主和属组都为1000
id  用户名   #查看用户信息(uid,gid)
 
[root@xinlinux-01 ~]# ls -l /mnt/123.txt
-rw-r--r-- 1 user1 user1 0 10月  2 09:50 /mnt/123.txt
[root@xinlinux-01 ~]# id user1
uid=1000(user1) gid=1000(user1) 组=1000(user1)
 
 
#报错
[root@xinlinux-01 ~]# showmount -e 192.168.233.150
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
#无法与服务端111端口通信
 
两个可能:
1、服务端的rpc服务没开启;
2、防火墙没关闭;
 
两边同时关闭firewalld和SEXlinux
systemctl  stop  firewalld
setenforce  0
 
 
14.4 exportfs命令
使用场景:当需要变更(更改、增加或删除)共享目录,要先更改配置文件,然后重启nfs服务;但是这样会让客户端的nfs挂起状态,无法正常访问,进程杀不死,重启nfs也重启不了(所以要重启服务端的nfs,要先将客户端挂载的nfs卸载umount)
 
exportfs命令(不用重启nfs也能使配置文件生效)
• 常用选项
-a 全部挂载或者全部卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享目录
 
 
测试:服务端创建新的共享目录tmp,客户端创建xinlinux目录作为tmp目录的挂载目录
 
• 以下操作在服务端上
vim /etc/exports 
#增加共享目录/tmp/
/tmp/ 192.168.233.0/24(rw,sync,no_root_squash)
 
exportfs -arv 
#不用重启nfs服务,配置文件就会生效
[root@xinlinux-03 ~]# exportfs -arv
exporting 192.168.233.0/24:/tmp
exporting 192.168.233.0/24:/home/nfstestdir
 
• 以下操作在客户端
mkdir /xinlinux
• mount -t nfs   192.168.233.150:/tmp /xinlinux
• touch /xinlinux/test.txt
• ls -l  /xinlinux/test.txt
#发现所有者和所属组都是root,因为配置文件的时候选择了no_root_squash,root用户不受限制
[root@xinlinux-01 ~]# mount -t nfs 192.168.233.150:/tmp/   /xinlinux/
[root@xinlinux-01 ~]# touch /xinlinux/test.txt
[root@xinlinux-01 ~]# ls -l /xinlinux/test.txt
-rw-r--r-- 1 root root 0 10月  2 10:04 /xinlinux/test.txt
 
 
14.5 NFS客户端问题
#客户端文件属主属组nobody
NFS 4版本会有问题:
客户端挂载共享目录后,不管是root用户还是普通用户,创建新文件时属主、属组为nobody
 
解决问题两种方案:
1、客户端挂载时加上 -o nfsvers=3    #将nfs版本变成3
 
先正常挂载,然后重新挂载
mount  -t  nfs  -o nfsvers=3  192.168.233.150:/tmp/   /xinlinux
 
mount  -t  nfs  -oremount,nfsvers=3  192.168.233.150:/tmp/   /xinlinux
[root@xinlinux-01 ~]# umount /xinlinux
[root@xinlinux-01 ~]# mount  -t  nfs  -o nfsvers=3  192.168.233.150:/tmp/   /xinlinux
[root@xinlinux-01 ~]# mount  -t  nfs  -oremount,nfsvers=3  192.168.233.150:/tmp/  /xinlinux
 
2、修改/etc/idmapd.conf文件
#客户端和服务端都需要
 
vim /etc/idmapd.conf 
#把“#Domain = local.domain.edu” 改为 “Domain = xxx.com” (这里的xxx.com,随意定义),然后再重启rpcidmapd服务(重启rpcbind服务即可)
 
 
15.1 FTP介绍
FTP是File Transfer Protocol(文件传输协议,简称文传协议)的英文简称,用于在Internet上控制文件的双向传输。
 
#FTP的主要作用就是让用户连接一个远程计算机(这些计算机上运行着FTP服务器程序),并查看远程计算机中的文件,然后把文件从远程计算机复制到本地计算机,或把本地计算机的文件传送到远程计算机。
 
#小公司用的多,大企业不用FTP,因为不安全
 
 
15.2/15.3 使用vsftpd搭建ftp
#centos上自带vsftpd软件包
搭建ftp
1、下载vsftpd包
yum install -y vsftpd
 
2、创建virftp虚拟用户
#这个用户不是通过ssh登录,是通过ftp登录到该用户的家目录,为了安全,-s  /sbin/nologin,不能通过ssh登录用户系统
useradd -s /sbin/nologin virftp
 
3、编辑vsftpd的虚拟用户的密码文件,定义用户的文件密码
vim /etc/vsftpd/vsftpd_login  
#内容如下,奇数行为用户名,偶数行为密码,多个用户就写多行
testuser1
123456
 
4、设置密码文件的权限
chmod 600 /etc/vsftpd/vsftpd_login
 
5、将文本密码文件转化为计算机能识别的二进制文件
db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db
 
6、创建虚拟用户配置文件所在目录
mkdir /etc/vsftpd/vsftpd_user_conf
 
7、定义虚拟用户配置文件(文件命名要与用户名保持一致)
cd /etc/vsftpd/vsftpd_user_conf
• vim testuser1
#加入如下内容
local_root=/home/virftp/testuser1
#定义虚拟用户的家目录
anonymous_enable=NO
#是否允许匿名用户
write_enable=YES
#是否允许可写
local_umask=022
#定义umask值
anon_upload_enable=NO
#是否允许匿名用户可上传
anon_mkdir_write_enable=NO
#是否允许匿名用户创建目录并且可写
idle_session_timeout=600
#连接ftp后空闲时间段后断开连接
data_connection_timeout=120
#数据传输的超时时间
max_clients=10
#最大客户端数量
 
8、创建虚拟用户家目录
• mkdir  /home/virftp/testuser1
• touch /home/virftp/testuser1/aming.txt
 
9、更改家目录所有者,属组权限
• chown -R virftp:virftp /home/virftp
 
10、定义密码文件存放cd位置
vim /etc/pam.d/vsftpd 
#在最前面加上
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这个认证文件
 
11、编辑vsftpd主配置文件
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
 
•  再增加如下内容
chroot_local_user=YES
guest_enable=YES
guest_username=virftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
allow_writeable_chroot=YES
 
12、重启vsftpd服务
systemctl start vsftpd //启动vsftpd服务
 
netstat  -lntp   #查看ftp监听端口是否启动ftp监听21端口)
 
Linux客户端测试:
yum install -y lftp       #Linux安装ftp客户端软件
lftp ftpuser1@127.0.0.1
 
#执行命令ls,看是否正常输出
#若不正常查看日志/var/log/messages和/var/log/secure
 
windows客户端测试:
# windows下安装filezilla客户端软件,进行测试
 
 
15.4 xshell使用xftp传输文件
第一种方案:xshell新建会话,协议改为SFTP,其他的往常改动,然后登陆,输入设置的虚拟用户密码,get到的文件会放会话属性的SFTP-->定义的本地文件夹
 
第二种方案:xshell借助xftp插件
在xsehll界面按CTRL+ALT+F,打开xftp插件;如果没有下载下载,去r.aminglinux.com下载
 
#双击、拖移即可下载文件
 
 
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
 
 
 
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
存储结构
每张表被存放在三个文件:
  1. frm-表格定义
  2. MYD(MYData)-数据文件
  3. 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备份时可以使用,避免过程中全局锁表导致
 
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
一、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用户就彻底删除了。

 

posted @ 2018-10-02 11:05  最爱吃菜  阅读(361)  评论(0编辑  收藏  举报