Linux安装MySQL

1、下载MySQL服务,MySQL下载地址 https://dev.mysql.com/downloads/mysql/

未分类

2、选择对应的系统下载之后,通过共享文件的方式,传到服务器/usr/local/目录下。然后解压

tar zxvf mysql-5.6.42-linux-glibc2.12-x86_64.tar.gz -C ./

3、安装依赖

yum -y install perl perl-devel autoconf libaio

4、复制解压后的mysql目录到系统的本地软件目录

cp -r mysql-5.6.33-linux-glibc2.5-x86_64 /usr/local/mysql

5、添加系统mysql组和mysql用户

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

6、进入安装mysql软件目录,修改目录拥有者为mysql用户

cd mysql/
chown -R mysql:mysql ./

7、安装数据库,在/usr/local/mysql目录下执行下面命令

./scripts/mysql_install_db --user=mysql

8、修改当前目录拥有者为root用户

chown -R root:root ./

9、修改当前data目录拥有者为mysql用户

chown -R mysql:mysql data

10、添加mysql服务开机自启动,把启动脚本放到开机初始化目录。

cp support-files/mysql.server /etc/init.d/mysql
# 赋予可执行权限
chmod +x /etc/init.d/mysql
# 添加服务
chkconfig --add mysql 

11、查看服务列表

chkconfig --list

未分类

如果看到mysql的服务,并且3,4,5都是on的话则成功。如果是off,则执行

chkconfig --level 345 mysql on

12、先创建缺少的文件夹,再启动MySQL服务

#创建缺少的文件夹
mkdir /var/log/mariadb
#启动服务
service mysql start

如果在启动服务的时候出现下面这个问题:

未分类

这时候,需要创建一个日志文件:

touch /var/log/mariadb/mariadb.log

创建日志文件之后再启动,就OK了。

未分类

13、把mysql客户端放到默认路径

ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql

14、登录MySQL

#默认root用户没有密码
mysql -uroot -p

这时候会出现一个错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

解决方法:打开/etc/my.cnf,看看里面配置的socket位置是什么目录。“socket=/var/lib/mysql/mysql.sock”;路径和“/tmp/mysql.sock”不一致。
建立一个软连接:ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

15、设置root用户密码

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root');

未分类

结语:到这里,MySQL服务就算安装完成了。

MYSQL中的COLLATE是什么?

在mysql中执行show create table 指令,可以看到一张表的建表语句,example如下:

CREATE TABLE `table1` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',
    `field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段2',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci;

大部分字段我们都能看懂,但是今天要讨论的是COLLATE关键字。这个值后面对应的utf8_unicode_ci是什么意思呢?面试的时候用这个题目考一考DBA,应该可以难倒一大部分人。

COLLATE是用来做什么的?

使用phpmyadmin的开发可能会非常眼熟,因为其中的中文表头已经给出了答案:

未分类

所谓utf8_unicode_ci,其实是用来排序的规则。对于mysql中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列,都需要有一个COLLATE类型来告知mysql如何对该列进行排序和比较。简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响DISTINCTGROUP BYHAVING语句的查询结果。另外,mysql建索引的时候,如果索引列是字符类型,也会影响索引创建,只不过这种影响我们感知不到。总之,凡是涉及到字符类型比较或排序的地方,都会和COLLATE有关。

各种COLLATE的区别

COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如Latin1编码的默认COLLATE为latin1_swedish_ci,GBK编码的默认COLLATE为gbk_chinese_ci,utf8mb4编码的默认值为utf8mb4_general_ci。

这里顺便讲个题外话,mysql中有utf8和utf8mb4两种编码,在mysql中请大家忘记utf8,永远使用utf8mb4。这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。

很多COLLATE都带有_ci字样,这是Case Insensitive的缩写,即大小写无关,也就是说”A”和”a”在排序和比较的时候是一视同仁的。selection * from table1 where field1=”a”同样可以把field1为”A”的值选出来。与此同时,对于那些_cs后缀的COLLATE,则是Case Sensitive,即大小写敏感的。

在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE。以utf8mb4为例,该编码所支持的所有COLLATE如下图所示。

未分类

mysql中和utf8mb4相关的所有COLLATE

图中我们能看到很多国家的语言自己的排序规则。在国内比较常用的是utf8mb4_general_ci(默认)、utf8mb4_unicode_ci、utf8mb4_bin这三个。我们来探究一下这三个的区别:

首先utf8mb4_bin的比较方法其实就是直接将所有字符看作二进制串,然后从最高位往最低位比对。所以很显然它是区分大小写的。

而utf8mb4_unicode_ci和utf8mb4_general_ci对于中文和英文来说,其实是没有任何区别的。对于我们开发的国内使用的系统来说,随便选哪个都行。只是对于某些西方国家的字母来说,utf8mb4_unicode_ci会比utf8mb4_general_ci更符合他们的语言习惯一些,general是mysql一个比较老的标准了。例如,德语字母“ß”,在utf8mb4_unicode_ci中是等价于”ss”两个字母的(这是符合德国人习惯的做法),而在utf8mb4_general_ci中,它却和字母“s”等价。不过,这两种编码的那些微小的区别,对于正常的开发来说,很难感知到。本身我们也很少直接用文字字段去排序,退一步说,即使这个字母排错了一两个,真的能给系统带来灾难性后果么?从网上找的各种帖子讨论来说,更多人推荐使用utf8mb4_unicode_ci,但是对于使用了默认值的系统,也并没有非常排斥,并不认为有什么大问题。结论:推荐使用utf8mb4_unicode_ci,对于已经用了utf8mb4_general_ci的系统,也没有必要花时间改造。

另外需要注意的一点是,从mysql 8.0开始,mysql默认的CHARSET已经不再是Latin1了,改为了utf8mb4(参考链接https://dev.mysql.com/doc/refman/8.0/en/charset-applications.html),并且默认的COLLATE也改为了utf8mb4_0900_ai_ci。utf8mb4_0900_ai_ci大体上就是unicode的进一步细分,0900指代unicode比较算法的编号( Unicode Collation Algorithm version),ai表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的。

COLLATE设置级别及其优先级

设置COLLATE可以在示例级别、库级别、表级别、列级别、以及SQL指定。实例级别的COLLATE设置就是mysql配置文件或启动指令中的collation_connection系统变量。
库级别设置COLLATE的语句如下:

CREATE DATABASE <db_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果库级别没有设置CHARSET和COLLATE,则库级别默认的CHARSET和COLLATE使用实例级别的设置。在mysql8.0以下版本中,你如果什么都不修改,默认的CHARSET是Latin1,默认的COLLATE是latin1_swedish_ci。从mysql8.0开始,默认的CHARSET已经改为了utf8mb4,默认的COLLATE改为了utf8mb4_0900_ai_ci。

表级别的COLLATE设置,则是在CREATE TABLE的时候加上相关设置语句,例如:

CREATE TABLE (

……

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

如果表级别没有设置CHARSET和COLLATE,则表级别会继承库级别的CHARSET与COLLATE。

列级别的设置,则在CREATE TABLE中声明列的时候指定,例如

CREATE TABLE (

`field1` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',

……

) ……

如果列级别没有设置CHARSET和COLATE,则列级别会继承表级别的CHARSET与COLLATE。

最后,你也可以在写SQL查询的时候显示声明COLLATE来覆盖任何库表列的COLLATE设置,不太常用,了解即可:

SELECT DISTINCT field1 COLLATE utf8mb4_general_ci FROM table1;

SELECT field1, field2 FROM table1 ORDER BY field1 COLLATE utf8mb4_unicode_ci;

如果全都显示设置了,那么优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 实例级别设置。也就是说列上所指定的COLLATE可以覆盖表上指定的COLLATE,表上指定的COLLATE可以覆盖库级别的COLLATE。如果没有指定,则继承下一级的设置。即列上面没有指定COLLATE,则该列的COLLATE和表上设置的一样。

以上就是关于mysql的COLLATE相关知识。不过,在系统设计中,我们还是要尽量避免让系统严重依赖中文字段的排序结果,在mysql的查询中也应该尽量避免使用中文做查询条件。

埋在 MYSQL 数据库应用中的17个关键问题!

Mysql的使用非常普遍,跟mysql有关的话题也非常多,如性能优化、高可用性、强一致性、安全、备份、集群、横向扩展、纵向扩展、负载均衡、读写分离等。要想掌握其中的精髓,可得花费不少功力,虽然目前流行的mysql替代方案有很多,可是从最小成本最容易维护的角度而言,mysql还是首选。下面从应用场景的角度切入,对mysql的技术点进行组织,写一份知识图谱,方便进行更深入的学习和总结。

如下图整理,我试着把Mysql的应用场景分为6种,每种场景下需要考虑的重点问题不一样,从而引出不同问题点下需要补齐的知识点,后续继续基于这些知识点进行学习和整理。(期待大家的意见和提供学习材料,谢谢!)

未分类

一、单Master

未分类

单Master的情况是普遍存在的,对于很多个人站点、初创公司、小型内部系统,考虑到成本、更新频率、系统重要性等问题,系统只依赖一个单例数据库提供服务,基本上已经满足需求。这种场景下我觉得重点应该关注的话题有上图所示的四点。

其中最重要的环节是数据备份,如果是交易量非常低,并且具有非常明确的服务时间段特性的话,简单的mysqldump是可以胜任的。但是这是有缺陷的,数据还原之后注定从备份点到还原点之间的数据会丢失。然而在极多数的情况下,备份的工作是没法马虎的,如下列举的几点小细节,下学期将分享更多操作性的文章。

1)冷备:停机,直接copy物理文件,InnoDB引擎(frm文件、共享表空间文件、独立表空间文件、重做日志文件、my.cnf)。

恢复:把文件copy到对应目录。

2)热备: Ibbackup或者XtraBackup工具,记录重做日志文件检查点的LSN,copy共享表空间文件以及独立表空间文件(不产生任何阻塞),记录copy后重做日志文件检查点的LSN,copy备份是产生的重做日志。

恢复:恢复表空间文件,应用重做日志文件。

3)温备:

  • mysqldump,–single-transaction参数进行事务管理保证数据一致性。备份时不能用DDL语句。 恢复:直接执行文件,mysql –uroot –p <文件名.sql>

  • 二进制半同步复制,主从服务器增量复制

恢复:mysqlbinlog

二、一主一从

未分类

考虑一主一从的多数初衷是系统性能和系统高可用性问题,除了单Master场景中的备份工作需要做好以外,还有性能优化、读写分离、负载均衡三项重点工作需要考虑。其中性能优化的内容比较多,也是一块大主题,要从系统的服务指标作为依据采取相应的动作,多数系统要求的是3秒内完成请求,总体换算下来,数据库大概可以有1.5秒的总执行时间,能满足这个性能要求就是合理的优化方案。下学期以这样的优先级来分别整理内容:索引优化 -》 表设计优化 -》数据库配置优化 -》硬件优化。

读写分离和负载均衡的实现相对简单些,我目前维护的系统比较落后,没有做读写分离,因为是一套以报表类功能为主的系统,而负载均衡是依赖php代码来做的,从实际运维效果来看,不大理想,而且负载均衡的代码过分嵌入到业务逻辑代码中,给代码维护带来一定噪音。下学期计划对各种中间件进行实践和性能测试,到时候把一些测试数据分享出来。

三、一主 n 从

未分类

一旦开始考虑一主多从的服务器架构,则证明你的系统对可用性、一致性、性能中一种或者多种的要求比较高。好多系统在开始搭建的时候都会往这个方向看齐,毕竟这样“看起来”系统会健壮很多。不过其实并不能单单依靠mysql的配置和mysql自带的中间件来解决可用性、一致性方面的问题。

四、横向集群

未分类

系统庞大到需要分库分表,其实是一件可喜可贺的事情,但是切记的是要前面提到性能优化工作做到极致之后才好考虑这些会增加系统复杂度的解决方案。横向集群主要是从业务特性的角度对系统进行切分,最彻底就是切分成了各个子系统,子系统之间通过一些数据同步的方案来把一些核心数据进行共享,以避免跨库调用跨库join。

然后是各种系统接口调用,把大事务拆成小事务,事务之间做好隔离和同步。上图中的三个问题在横向集群的架构体系中应属于很有特色的问题,在实际项目中其实是尽量去避免这些需求的存在的,不过如果确实需要了,也得有解决方案。下学期也将针对这些问题进行逐一整理,并测试一下一些号称支持这些功能的中间件。

五、纵向集群

未分类

横向集群的切分思路最终是切分子系统,而纵向集群最后遇到的最棘手的问题是扩缩容,我运维的一个系统是提前对数据做了256个切片,256切片中0~127切片和128~255切片分别存在两个一主两从的数据库集群中,系统运维了3年多,目前还没有扩容需求。设计初衷应该是考虑得到,假设有一天数据量非常大,可以把256个切片分4大片,分别存储到4个一主两从的集群中,从而实现扩容。

这个思路的确是可取的,只是我们的分库逻辑当前是php代码实现,也有一定程度上影响了业务代码的逻辑,运维起来有点心惊胆战,还是保持业务代码清爽比较好。

下学期将介绍一些实现了库路由功能的中间件的使用,也根据实际情况把想到的一些扩缩容方案实践一遍,敬请期待实操效果的分享。

六、混合模式

与其说这部分内容讨论上面5种场景的混合,不如说这部分内容是做总结。上面的5种场景中,一共列举了17个问题点,这17个问题点基本上都是叠加式的,越往深入的框架去做就越需要考虑齐这17个问题点。17个问题点考虑全了,混合模式下的问题就不成问题了。

samba 中文乱码解决

步骤一:查看系统编码

[root@localhost public]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

步骤二:修改smb.conf配置文件

根据步骤一来判断,
如果locale是zh_CN.UTF-8,做如下设置:

display charset = utf8

unix charset = utf8

dos charset = utf8

如果locale是zh_CN.GBK或zh_CN.gb2312,做如下设置:

display charset = cp936

unix charset = cp936

dos charset = cp936

步骤三:重启samba服务

service samba restart

Ubuntu 18.04安装Samba服务器及配置

局域网下使用samba服务在Linux系统与Windows系统直接共享文件是一项很方便的操作。以Ubuntu为例配置samba服务,Linux服务器的版本是Ubuntu 18.04.1 LTS。

未分类

在终端中执行下列指令:cat /etc/issue查看当前正在运行的 Ubuntu 的版本号。

未分类

以下是我的安装配置步骤:

(1)更新当前软件

sudo apt-get upgrade  
sudo apt-get update  
sudo apt-get dist-upgrade

(2)安装samba服务器

sudo apt-get install samba samba-common

未分类

(3)创建一个用于分享的samba目录

sudo mkdir /home/linuxidc/linuxidc.com/share

(4)给创建的这个目录设置权限

sudo chmod 777 /home/linuxidc/linuxidc.com/share

未分类

(5)添加用户(下面的linuxidc是我的用户名,之后会需要设置samba的密码)

sudo smbpasswd -a linuxidc

未分类

(6)配置samba的配置文件

sudo nano /etc/samba/smb.conf

在配置文件smb.conf的最后添加下面的内容:

[share]
comment = share folder
browseable = yes
path = /home/linuxidc/linuxidc.com/share
create mask = 0700
directory mask = 0700
valid users = linuxidc
force user = linuxidc
force group = linuxidc
public = yes 
available = yes 
writable = yes

未分类

在上面valid users = linuxidc中的linuxidc为我的用户名。

(7)重启samba服务器

sudo service smbd restart

(8)Windows徽标+R 在弹出的运行窗口中输入 \ip即可访问。如\192.168.182.188,输入samba用户名及密码访问即可看到共享,然后就可以在Linux系统与Windows系统直接进行文件共享了

Win+R:在弹出的运行窗口中输入ip(在ubuntu中用ifconfig查看ip)即可访问。

未分类

如果提示:提示你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。这些策略可帮助保护你的电脑免受网络上不安全设备或恶意设备的威胁。

解决方法见:https://www.linuxidc.com/Linux/2018-11/155467.htm

(9)输入samba用户名及密码访问即可看到共享文件夹shar

未分类

上传创建文件

未分类

(10)选中share,点击右键,选择映射网络驱动器

未分类

未分类

(11)最终结果如下图

未分类

CentOS7 Squid 网络代理安装和配置

爬虫代理的作用

在我们的爬虫系统中,如果在一台服务器上不停的访问通一个目标站点,很有可能因为对方的发爬虫策略而将您的爬虫请求给阻止,导致您无法获取网站的信息。所以我们一般采用一个代理池的方式,不停的切换代理,将爬虫的请求伪装成为不同代理发起的,从而避开这种问题。这里以 centos7 和 squid 为例介绍如何建立一个 http 或者 https 的代理服务器。

软件安装

该软件需要使用 openssl 组件,所以如果没有安装请执行如下命令进行安装

yum install openssl

首先检查是否已经安装了 squid 软件。执行如下的命令

rpm -qa squid

如果显示 package squid is not installed 则表示没有安装,否则会显示具体的安装包信息。如果没有安装,则执行安装命令如下

yum install -y squid*

结束后,再执行检查命令,则显示结果如下

[root@localhost ~]# rpm -qa squid
squid-3.5.20-12.el7.x86_64

软件配置

squid 的配置文件默认是 /etc/squid/squid.conf 文件。默认情况下,squid 只允许有限几个内网地址段来访问。所以我们在的 acl localcal 部分加入如下的内容:

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src 0.0.0.0/20

上面一行是原来有的,下面一个行是我们先加入的。然后我们改一下默认的端口号

#http_port 3128
http_port 5872

最后修改一下访问日志配置

coredump_dir /var/spool/squid
access_log /var/log/squid/access.log

下面一行设置了访问日志的文件为 /var/log/squid/access.log

启动服务

首先需要在防火墙中开放刚才配置的端口 5872 。执行如下命令

firewall-cmd --zone=public --add-port=5872/tcp --permanent
firewall-cmd --reload

这个命将 5872 端口加入到防火墙的开发端口列表中持久化保存,并且重新载入防火墙策略,让其生效

然后执行命令启动

systemctl start squid

启动后,我们执行命令命令

[root@localhost ~]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1689/master         
tcp        0      0 0.0.0.0:15678           0.0.0.0:*               LISTEN      20050/sshd          
tcp6       0      0 :::5872                 :::*                    LISTEN      27903/(squid-1)    

可以看到,squid 服务已经在端口 5872 上开始监听了

使用和监控

已 chrome 为例。打开 chrome “设置菜单”,在底部展开“高级”,在底部找到“打开代理设置”菜单,在对话框中点击“局域网设置”按钮,在新出现的界面中输入代理服务器的设置。如下图所示

未分类

确定后,就可以在浏览器中使用代理服务器来访问网络了。为了看到效果,我们在浏览器上访问《不一样的 Java 日期格式化大全》 这篇文章,同时对代理服务器的访问日志进行监控,看到日志输出如下

[root@localhost ~]# tail -f /var/log/squid/access.log 
1543289079.273  16467 192.168.1.60 TCP_TUNNEL/200 3687 CONNECT upload-images.jianshu.io:443 - HIER_DIRECT/61.156.196.84 -
1543289079.274  16715 192.168.1.60 TCP_TUNNEL/200 152 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -
1543289079.274  16667 192.168.1.60 TCP_TUNNEL/200 4159 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -
1543289079.524      0 192.168.1.60 TCP_DENIED/403 4085 CONNECT events.jianshu.io:4006 - HIER_NONE/- text/html
1543289081.664      0 192.168.1.60 TCP_DENIED/403 4085 CONNECT events.jianshu.io:4006 - HIER_NONE/- text/html
1543289082.433      0 192.168.1.60 TCP_DENIED/403 4085 CONNECT events.jianshu.io:4006 - HIER_NONE/- text/html
1543289097.966  35623 192.168.1.60 TCP_TUNNEL/200 55584 CONNECT upload-images.jianshu.io:443 - HIER_DIRECT/61.156.196.84 -
1543289097.991  35259 192.168.1.60 TCP_TUNNEL/200 16029 CONNECT upload-images.jianshu.io:443 - HIER_DIRECT/61.156.196.84 -
1543289099.311  60913 192.168.1.60 TAG_NONE/503 0 CONNECT clients4.google.com:443 - HIER_NONE/- -
1543289100.321  38894 192.168.1.60 TCP_TUNNEL/200 23165 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -
1543289109.312  47056 192.168.1.60 TCP_TUNNEL/200 10707 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -

可以看到,是通过代理服务器的转发来访问的目标网站。

代理服务器鉴权

上面的代理服务器如果是在公网上提供服务的,那么所有人都能使用这个代理服务。如果我们想加入鉴权机制对这个进行限制,则需要增加其他配置。这里我们采用用户名和密码的鉴权方式,具体方法如下。
首先用 apache 的密码工具生成用户密码,如果没有的话需要先安装 httpd 软件

yum install httpd

然后生成密码。

[root@localhost ~]# htpasswd -c /etc/squid/passwd youname
New password: 
Re-type new password: 
Adding password for user youname

如果没有 htpasswd 命令,则安装 apache

yum install -y httpd

在 http_access deny all 语句之前,加入如下的配置内容

cache_dir ufs /var/spool/squid 100 16 256
cache_mem 128 MB
maximum_object_size 128 MB
cache_dir ufs /var/spool/squid 100 16 256

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm your message
auth_param basic credentialsttl 5 hours
acl ncsa_users proxy_auth REQUIRED
http_access allow ncsa_users

然后重启

Sed:一些常用的命令详解

Sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下Sed的用法。

用法

Sed命令行格式

sed -$Options "$Features" $File

$Options

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

指定行数

不一定要存在指定的行数,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20行之间进行的,则完整代码是sed -$Options "10,20$Features" $File

$Features

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代你指定行的所有内容!
d :删除, 因为是删除啊,所以 d 后面通常不接任何东西;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印, 亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
r :引入, sed中的 r 命令会把其后面的任何字符判读为文件名,直到回车符或是单引号;
s :取代, 可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 sed “s/要被取代的字串/新的字串/g”就是啦!

$File

你要进行动作的文件名例如98k.txt

实例

假设我们有一文件名为98k.txt,内容如下

this is a newfile!
hello world
please
asd12
123asdasd

删除某行

对98k.txt的行进行操作,将操作结果输出到终端(只是做模拟操作,不改动源文件)

sed "1d" 98k.txt         # 输出删除第一行后的文件内容
sed "$d" 98k.txt         # 输出删除最后一行后的文件内容
sed "1,2d" 98k.txt       # 输出删除第一行到第二行后的文件内容
sed "2,$d" 98k.txt       # 输出删除第2行到最后1行后的文件内容

显示某行

sed -n "1p" 98k.txt           # 只显示文件的第一行 
sed -n "$p" 98k.txt           # 只显示文件的最后一行
sed -n "1,2p" 98k.txt         # 只显示文件的第一行到第二行
sed -n "2,$p" 98k.txt         # 显示文件的第二行到最后一行

使用安静模式进行查询

sed -n "/ruby/p" 98k.txt
输出关键字ruby所在行的内容;其中"/str/p",str为搜索的文本内容
sed -n "/$/p" 98k.txt
输出关键字$所在行的内容,使用反斜线屏蔽特殊含义

增加一行或多行字符串

sed "1a drink tea" 98k.txt            # 在第一行后增加字符串"drink tea"
sed "1,3a drink tea" 98k.txt          # 在第一行到第三行后增加字符串"drink tea"
sed "1a drink teanor coffee" 98k.txt # 在第一行后增加两行,换行使用n,可多次使用n添加多行

增加另外一个文件的内容

sed "1r 1.txt" 98k.txt     # 把1.txt的内容增加到98k.txt的第一行后

替代一行或多行

sed "1c Hi" 98k.txt    # 把98k.txt的第一行替换为Hi
sed "1,2c Hi" 98k.txt  # 把98k.txt的第一行到第二行替换为Hi

替换一行中的某部分字符串

格式:sed "s/要替换的字符串/新的字符串/g" 98k.txt (要替换的字符串可以用正则表达式)

sed "s/ruby/bird/g" 98k.txt   # 把全部的ruby替换为bird
sed "s/ruby//g" 98k.txt       # 把全部的ruby替换为空,即删除ruby字符串

sed -i 命令详解

sed -i是直接对文件进行操作

# 对每行匹配到的第一个字符串进行替换
sed -i "s/原字符串/新字符串/" 98k.txt

# 对全局匹配上的所有字符串进行替换
sed -i "s/原字符串/新字符串/g" 98k.txt

# 删除所有匹配到字符串的行
sed -i "/匹配字符串/d"  98k.txt

# 特定字符串的行后插入新行
sed -i "/特定字符串/a 新行字符串" 98k.txt

# 特定字符串的行前插入新行
sed -i "/特定字符串/i 新行字符串" 98k.txt

# 把匹配行中的某个字符串替换为目标字符串
sed -i "/匹配字符串/s/源字符串/目标字符串/g" 98k.txt

# 在文件98k.txt中的末行之后,添加bye
sed -i "$a bye" 98k.txt

# 对于文件第3行,把匹配上的所有字符串进行替换
sed -i "3s/原字符串/新字符串/g" 98k.txt

sed命令详解

sed是Linux中处理文本最重要的两个工具之一,能够极大简化需要进行的数据处理任务。

sed被称为流编辑器(stream editor),可以根据命令来处理数据流中的数据。这些命令要么从命令行中输入,要么存储在一个命令文本文件中。sed会执行一下操作:

(1)一次从输入中读取一行数据

(2)根据所提供的编辑器命令匹配数据

(3)按照命令修改流中的数据

(4)将新的数据输出到STDOUT

在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中所有的数据行之后,它就会终止。

sed命令的格式为:

sed options script file

options中常用的选项如下所示:

  • -e command   将command中的命令添加到已有的命令中,也就是说当sed中使用多个命令时要使用这个选项。
  • -f file  将file中制定的命令添加到已有的命令中,注意每一个命令都要在独立的一行里。
  • -i  直接修改源文件。
  • -n 通常情况下,当所有命令执行完后输出会显示在STDOUT中,-n选项会禁止输出。通常和替换标记p一起使用,只输出被修改过的行。

script中的常用使用方式:

1、替换文本中的指定字符,形式为:

sed 's/pattern/replacement/flags'

主要用法有(注意:如果不加上-i选项,修改的都是流中的内容,file本身的内容没有变化):

sed 's/pattern/replacement/' file   将file的流中每行的第一个pattern替换成replacement
sed 's/pattern/replacement/g' file    将file的流中每行的每一个pattern替换成replacement
sed 's/pattern/replacement/2' file    将file的流中每行的第二个pattern替换成replacement
sed -n 's/pattern/replacement/p' file   将file的流中每行的第一个pattern替换成replacement,并打印出修改过的行
sed -n 's/pattern/replacement/2p' file   将file的流中每行的第二个pattern替换成replacement,并打印出修改过的行(标记符号可以多个一起使用,且顺序不影响结果)
sed 's/pattern/replacement/gw outFile' file   将file的流中每行的每一个pattern替换成replacement,并将输出保存到outFile中(w标记必须要放在最后,如果写作wg,标记g将无效,并生成名为g outFile的输出文件)
sed '2s/pattern/replacement/' file   将file的流中第二行的第一个pattern替换成replacement
sed '2,4s/pattern/replacement/' file   将file的流中第二行到第四行的第一个pattern替换成replacement
sed '2,$s/pattern/replacement/' file   将file的流中第二行到最后一行的第一个pattern替换成replacement
sed '/word/s/pattern/replacement/' file   将file的流中含有word的行中的第一个pattern替换成replacement,可以使用正则表达式

2、删除文本

sed 'd' file   将file的流中所有行全部删除
sed '2d' file   将file的流中的第二行删除
sed '2,4d' file   将file的流中的第二行到第四行删除
sed '2,$d' file   将file的流中的第二行到最后一行删除
sed '/word/d' file   将file的流中含有word的行删除

3、插入和附加文本

(1)插入(insert)命令(i)会在指定行前增加一个新行。

(2)附加(append)命令(a)会在指定行后增加一个新行。

格式为:

sed '[address]commandnew line'

主要用法为($和匹配模式/word/都可以使用):

sed '3iThis a an inserted line.' file   将一个新行插入到file的流的第三行前
sed '3aThis a an inserted line.' file   将一个新行插入到file的流的第三行后

4、修改行($和匹配模式/word/都可以使用):

sed '3cThis is a changed line.' file   将file的流的第三行修改为This is a changed line.

5、转换命令

转换(transform)命令(y)是唯一可以处理单个字符的sed命令,格式如下:

sed '[address]y/inchars/outchars'

转换命令会对inchars和outchars做一对一映射,inchars的第一个字符会被转换为outchars的第一个字符,inchars的第二个字符会被转换为outchars的第二个字符。如果inchars和outchars的长度不同,sed编辑器会产生一条错误消息:

sed: 1: "y/abc/de/": transform strings are not the same length

举例如下:

$ echo "1 2 3 1 2 3 2 3 4 5 6" | sed 'y/123/456/'

4 5 6 4 5 6 5 6 4 5 6

可以看出,转换命令是一个全局命令,会在文本行中找到的所有指定字符进行转换,无法限定只转换在特定地方出现的字符。

6、写入文件

sed 'w outFile' file   将file的内容写入到outFile中
sed '1,2w outFile' file   将file第一行到第二行的内容写入到outFile中

7、从文件读取数据($和匹配模式/word/都可以使用):

sed '3r newFile' file   将newFile的内容添加到file的流的第三行之后

centos7下rsync+crontab定期同步备份

最近需求想定期备份内部重要的服务器数据到存储里面,顺便做个笔记

以前整过一个win下的cwrsync(客户端)+rsync(服务端:存储)的bat脚本

这次整一个Linux下的脚本sh,执行定期自动备份数据

  • 客户端:192.168.0.100(rsync-Linux)

  • 服务端:192.168.0.252(存储)

rsync简介

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

1.服务端配置

rsync的服务端主要是群辉的存储,所以直接有界面式的配置,所以这边就不详细讲解,如下图:

未分类

2.客户端配置

创建密码文件,/etc/rsyncd/rsyncd.pass,并修改为 600 权限

[root@localhost ~]# mkdir rsyncd
[root@localhost ~]# vim /rsyncd/rsyncd.pass
[root@localhost ~]# chmod 600 /rsyncd/rsyncd.pass

▲说明:/rsyncd/rsyncd.pass其内密码需要和服务端内/etc/rsyncd/rsyncd.pass或存储rsync指定用户的密码保持一致

客户端向服务端传输文件,如果是 873 端口,可以把 –port 去掉

rsync -arvz --progress /data [email protected]::log --password-file=/rsyncd/rsyncd.pass

若有需要也可以从服务端拉取文件,需要把服务器的 /etc/rsyncd/rsyncd.conf 中的 write only = yes 给去掉

#拉取整个目录
rsync -arvz --progress --password-file=/rsyncd/rsyncd.pass --port=873 [email protected]::log /var/log
#拉取单个文件
rsync -arvz --progress --password-file=/rsyncd/rsyncd.pass --port=873 [email protected]::log/a.log /var/log

rsync服务端配置参数:

全局参数

在文件中[module]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。

port
指定后台程序使用的端口号,默认为873。

motd file
"motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。

log file
"log file"指定rsync的日志文件,而不将日志发送给syslog。比如可指定为“/var/log/rsyncd.log”。

pid file
指定rsync的pid文件,通常指定为“/var/run/rsyncd.pid”。

syslog facility
指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。

模块参数
主要是定义服务器哪个目录要被同步。其格式必须为“[module]”形式,这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。我们可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:

comment
给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

path
指定该模块的供备份的目录树路径,该参数是必须指定的。

use chroot
如 果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺 点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。

uid
该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。

gid
该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。

max connections
指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

list
该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。

read only
该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。

exclude
用来指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,一个 模块只能指定一个exclude选项。但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exclude列表,如果希望确保特定的文件不能 被访问,那就最好结合uid/gid选项一起使用。

exclude from
指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义。

include
用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合include和exclude可以定义复杂的exclude/include规则。

include from
指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file
该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的 secures file名,需要限式指定一个(例如:/etc/rsyncd.passwd)。注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

strict modes
该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true。

hosts allow
该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式:
单个IP地址,例如:192.167.0.1
整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多个IP或网段需要用空格隔开,“*”则表示所有,默认是允许所有主机连接。

hosts deny
指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

ignore errors
指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IO错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。

ignore nonreadable
指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。

lock file
指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。

transfer logging
使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。

log format
通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:
%h 远程主机名
%a 远程IP地址
%l 文件长度字符数
%p 该次rsync会话的进程id
%o 操作类型:"send"或"recv"
%f 文件名
%P 模块路径
%m 模块名
%t 当前时间
%u 认证的用户名(匿名时是null)
%b 实际传输的字节数
%c 当发送文件时,该字段记录该文件的校验码
默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。

timeout
通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。

refuse options
通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名,而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩,应该是:"dont compress = *"。

dont compress
用来指定那些不进行压缩处理再传输的文件,默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

rsync常用命令:

-v, --verbose 详细模式输出
 -q, --quiet 精简输出模式
 -c, --checksum 打开校验开关,强制对文件传输进行校验
 -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
 -r, --recursive 对子目录以递归模式处理
 -R, --relative 使用相对路径信息
 -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
 --backup-dir 将备份文件(如~filename)存放在在目录下。
 -suffix=SUFFIX 定义备份文件前缀
 -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
 -l, --links 保留软链结
 -L, --copy-links 想对待常规文件一样处理软链结
 --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
 --safe-links 忽略指向SRC路径目录树以外的链结
 -H, --hard-links 保留硬链结
 -p, --perms 保持文件权限
 -o, --owner 保持文件属主信息
 -g, --group 保持文件属组信息
 -D, --devices 保持设备文件信息
 -t, --times 保持文件时间信息
 -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
 -n, --dry-run现实哪些文件将被传输
 -W, --whole-file 拷贝文件,不进行增量检测
 -x, --one-file-system 不要跨越文件系统边界
 -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
 -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
 --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
 -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
 --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
 --delete 删除那些DST中SRC没有的文件
 --delete-excluded 同样删除接收端那些被该选项指定排除的文件
 --delete-after 传输结束以后再删除
 --ignore-errors 及时出现IO错误也进行删除
 --max-delete=NUM 最多删除NUM个文件
 --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
 --force 强制删除目录,即使不为空
 --numeric-ids 不将数字的用户和组ID匹配为用户名和组名
 --timeout=TIME IP超时时间,单位为秒
 -I, --ignore-times 不跳过那些有同样的时间和长度的文件
 --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
 --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
 -T --temp-dir=DIR 在DIR中创建临时文件
 --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
 -P 等同于 --partial
 --progress 显示备份过程
 -z, --compress 对备份的文件在传输时进行压缩处理
 --exclude=PATTERN 指定排除不需要传输的文件模式
 --include=PATTERN 指定不排除而需要传输的文件模式
 --exclude-from=FILE 排除FILE中指定模式的文件
 --include-from=FILE 不排除FILE指定模式匹配的文件
 --version 打印版本信息
 --address 绑定到特定的地址
 --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
 --port=PORT 指定其他的rsync服务端口
 --blocking-io 对远程shell使用阻塞IO
 -stats 给出某些文件的传输状态
 --progress 在传输时现实传输过程
 --log-format=formAT 指定日志文件格式
 --password-file=FILE 从FILE中得到密码
 --bwlimit=KBPS 限制I/O带宽,KBytes per second
 -h, --help 显示帮助信息

crontab简介

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/

# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

crontab文件的含义

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

  • minute: 表示分钟,可以是从0到59之间的任何整数。

  • hour:表示小时,可以是从0到23之间的任何整数。

  • day:表示日期,可以是从1到31之间的任何整数。

  • month:表示月份,可以是从1到12之间的任何整数。

  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

未分类

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

crontab常用命令

1.列出crontab文件

为了列出crontab文件,可以用:

[root@localhost ~]# crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty

你将会看到和上面类似的内容。可以使用这种方法在$HOME目录中对crontab文件做一备份:

[root@localhost ~]# crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

2.编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而编辑环境变量又设置为v i,那么就可以用vi来编辑crontab文件,相应的命令为:

[root@localhost ~]# crontab -e

可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month(注释说明)

 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} ;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

[root@localhost ~]# crontab -l 
 # (crondave installed on Tue May 4 13:07:43 1999)
 # DT:ech the date to the console every 30 minites
 0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1
 # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} ;

3.删除crontab文件

要删除crontab文件,可以用:

[root@localhost ~]# crontab -r

crontab使用实例

实例1:每1分钟执行一次command

命令:

* * * * * command

实例2:每星期日的晚上00 : 00执行rsync-sh脚本

命令:

[root@localhost ~]# crontab -e
# DT:Execute rsync-sh script every Sunday at 00: 00(注释说明)
0 0 * * 7 sh /root/rsyncd/rsync-gitbak.sh

rsync客户端自动与rsync服务器端同步

首先,我们来做一个shell脚本

[root@localhost rsyncd]# vim rsyncd.sh
#!/bin/bash
rsync -arvz --progress /data [email protected]::log --password-file=/rsyncd/rsyncd.pass

命令:crontab -e来编辑加入计划任务

[root@localhost ~]# crontab -e
# DT:Execute rsync-sh script every Sunday at 00: 00(注释说明)
0 0 * * 7 sh /root/rsyncd/rsyncd.sh

使用crontab -l查看加入的计划任务

[root@localhost ~]# crontab -l
0 0 * * 7 sh /root/rsyncd/rsyncd.sh

注意:

  1. 当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可。

  2. %在crontab中被认为是newline,要用来escape才行。比如crontab执行行中,如果有”date +%Y%m%d”,必须替换为:”date +%Y%m%d”

遇到的问题和解决方法

在Windows上面编辑了sh脚本上传到Linux上面,执行报错:

bad interpreter:No such file or directory

vim rsyncd.sh用命令:set ff?查看是doc还是unix格式,如果是dos格式,用命令:set ff=unix转化为unix格式

Linux下rsync 数据镜像备份 client / server 模式

rsync特性:

  • 可以镜像保存整个目录树和文件系统
  • 可以增量同步数据,文件传输效率高,因而同步时间很短。
  • 可以保持原有文件的权限、时间等属性。
  • 加密传输数据,保证了数据的安全性

两种模式:

  • client / server
  • client / client

安装rsync

yum install rsync

查看rsync版本

rpm -qa rsync
rsync-3.1.2-4.el7.x86_64

查看rsync安装位置

rpm -ql rsync

未分类

在服务器端:

编辑rsync配置文件

vim /etc/rsyncd

内容如下

uid = nobody
gid = nobody
use chroot = no
max connections = 10
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[rsync_module_1]
path = /rsync_data_1
comment = rsync_data for sharing to client server
ignore errors
read only = true
list = false
uid = root
gid = root
auth users = rsync_bak
secrets file = /etc/rsync_server.pass

未分类

按照配置文件内容,创建/etc/rsync_server.pass 文件,且权限为600
内容

rsync_bak:rsyncpwd
chmod 600 /etc/rsync_server.pass

未分类

根据配置文件创建相应的目录

mkdir -p /rsync_data_1

启动rsync服务和验证

/usr/bin/rsync --daemon
ps -ef | grep rsync
lsof -c rsync
netstat -antlp | grep rsync

未分类

未分类

客户端

确保安装了rsync组件

创建客户端rsync的密码文件,其密码和服务器端一致,且文件权限为600

vim /etc/rsync_client.pass
cat /etc/rsync_client.pass
rsyncpwd
chmod 600 /etc/rsync_client.pass

客户端指定/创建rsync的目录

mkdir -p /rsync_data

从服务器端拉取数据

/usr/bin/rsync -vzrtopg --delete --progress [email protected]::rsync_module_1 /rsync_data --password-file=/etc/rsync_client.pass

验证是否成功从服务器端拉取到数据

ll /rsync_data/

未分类