Linux用户、用户组、文件权限学习笔记

 

linux的权限系统主要是由用户、用户组和权限组成。
用户就是一个个的登录并使用linux的用户。linux内部用UID表示。
用户组就是用户的分组。linux内部用GID表示。
权限分为读、写、执行三种权限。

 

linux的用户信息保存在/etc/passwd文件中,另外,/etc/shadow文件存放的是用户密码相关信息。

/etc/passwd文件格式:
用户名:密码:UID:GID:用户信息:HOME目录路径:用户shell
其中UID为0则是用户root,1~499为系统用户,500以上为普通用户

 

/etc/shadow保存用户密码信息,包括加密后的密码,密码过期时间,密码过期提示天数等。

 

用户组信息保存在/etc/group文件中.
格式如下:
用户组名:组密码:GID:组内帐号(多个帐号用逗号分隔)

 

用户登录后,/etc/passwd文件里的GID为用户的初始用户组。
用户的初始用户组这一事实不会再/etc/group中体现。

 

 

查看当前用户的用户组命令:
[root@local opt]#groups
root bin daemon sys adm disk wheel
输出的信息中,第一个用户组为当前用户的有效用户组(当前用户组)

 

 

切换有效用户组命令:
[root@local opt]#newgrp 用户组名
要离开新的有效用户组,则输入exit回车。

 

 

新建用户命令:
[root@local opt]#useradd 用户名 -g 初始用户组 -G 其他用户组(修改/etc/group) -c 用户说明 -u 指定UID

 

 

建完用户需要为用户设置密码:
[root@local opt]#passwd 用户名

用户要修改自己密码命令:

[root@local opt]#passwd

修改用户信息命令:

[root@local opt]#usermod 参数 用户名
参数:
 -c 说明
 -g 组名 初始用户组
-e 过期日期 格式:YYYY-MM-DD
 -G 组名 其他用户组
 -l 修改用户名
 -L 锁定账号(在/etc/shadow文件中用户对应密码密码串的前面加上两个叹号(!!))
 -U 解锁

删除用户命令:

[root@local opt]#userdel [-r] 用户名
其中,参数-r为删除用户的home目录。
其实,可能在系统其他地方也有该用户文件,要完整删除一个用户和其文件要先找到属于他的文件:
[root@local opt]#find / -user 用户名
然后删除,再运行userdel删除用户。

 

查看可用shell命令:
[root@local opt]#chsh -l 
修改自己的shell命令:
[root@local opt]#chsh -s

 

查看自己或某人UID/GID信息:
[root@local opt]#id [用户名]
返回信息中groups为有效用户组

 

新增用户组命令:
[root@local opt]#groupadd 用户组名

 

修改用户组名命令:
[root@local opt]#groupmod -n 名称

 

删除用户组命令:
[root@local opt]#groupdel 用户组名

设置用户组密码命令:

[root@local opt]#gpasswd 用户组名

 

如果gpasswd加上参数则有其他功能

 

设置用户组管理员命令:
[root@local opt]#gpasswd -A 用户名 用户组名

 

添加某帐号到组命令:
[root@local opt]#gpasswd -M 用户名 用户组名

 

从组中删除某帐号命令:
[root@local opt]#gpasswd -d 用户名 用户组名

 

passwd相关参数操作:
-l 锁用户
-u 解锁用户
-n 天数  密码不可改天数
-x 天数  密码过期天数
-w 天数  警告天数

 

  文件权限知识


先看个实例:
[root@local opt]#ls -al
ls -al 命令是列出目录的所有文件,包括隐藏文件。隐藏文件的文件名第一个字符为'.'
-rw-r--r--  1 root root    81 08-02 14:54 gtkrc-1.2-gnome2
-rw-------  1 root root   189 08-02 14:54 ICEauthority
-rw-------  1 root root    35 08-05 10:02 .lesshst
drwx------  3 root root  4096 08-02 14:54 .metacity
drwxr-xr-x  3 root root  4096 08-02 14:54 nautilus

 

列表的列定义如下:
[权限属性信息] [连接数] [拥有者] [拥有者所属用户组] [大小] [最后修改时间] [文件名]

 

权限属性列表为10个字符:
第一个字符表示文件类型,d为目录 -为普通文件 l为连接 b为可存储的接口设备 c为键盘鼠标等输入设备
2、3、4个字符表示所有者权限,5、6、7个字符表示所有者同组用户权限,8、9、10为其他用户权限
第二个字符表示所有者读权限,如果有权限则为r,没有权限则为-
第三个字符表示所有者写权限,如果有权限则为w,没有权限则为-
第四个字符表示所有者执行权限,如果有权限则为x,没有权限则为-
第五个字符表示所有者同组用户读权限,如果有权限则为r,没有权限则为-
第六个字符表示所有者同组用户写权限,如果有权限则为w,没有权限则为-
第七个字符表示所有者同组用户执行权限,如果有权限则为x,没有权限则为-
第八个字符表示其他非同组读权限,如果有权限则为r,没有权限则为-
第九个字符表示其他非同组写权限,如果有权限则为w,没有权限则为-
第十个字符表示其他非同组执行权限,如果有权限则为x,没有权限则为-

 

修改文件所属组命令:
[root@local opt]#chgrp [-R] 组名 文件名
其中-R为递归设置

 

修改文件的所有者和组命令:
[root@local opt]#chown [-R] 用户[:用户组] 文件名

 

修改文件访问权限命令:
[root@local opt]#chmod [-R] 0777 文件名

基础 - LAMP系统性能调优 理解LAMP架构

使用 LAMP(Linux®、Apache、MySQL 和 PHP/Perl)架构的应用程序不断被开发和部署。但是,服务器管理员对应用程序本身几乎没有控制能力,因为应用程序是别人编写的。许多服务器配置问题,这些配置会影响应用程序的性能。本文讨论 LAMP 架构、一些性能度量技术以及一些基本的 Linux 内核、硬盘和文件系统调节。

Linux、 Apache、MySQL 和 PHP(或 Perl)是许多 Web 应用程序的基础 —— 从 to-do 列表到 blog,再到电子商务站点。WordPress 和 Pligg 是两个支持大容量 Web 站点的常用软件包。这种架构简称为 LAMP。几乎每个 Linux 发布版都包含 Apache、MySQL、PHP 和 Perl,所以安装 LAMP 软件是非常容易的。

安装的简便性使人误以为这些软件会自行顺利地运行,但是实际情况并非如此。最终,应用程序的负载会超出后端服务器自带设置的处理能力,应用程序的性能会降低。LAMP 安装需要不断监控、调优和评估。

系统调优对于不同的人有不同的含义。本系列主要关注 LAMP 组件(Linux、Apache、MySQL 和 PHP)的调优。对应用程序本身进行调优是另一个复杂的问题。应用程序和后端服务器之间存在一种共生关系:未能适当调优的服务器甚至会使最好的应用程序在负载之下崩溃,而借助充分的调优,完全可以避免编写得很糟糕的应用程序使服务器缓慢如牛。幸运的是,正确的系统调优和监视可以指出应用程序中的问题。
 

LAMP 架构

对任何系统进行调优的第一步都是了解它的工作原理。按照最简单的形式,基于 LAMP 的应用程序是用 PHP 这样的脚本语言编写的,它们作为 Linux 主机上运行的 Apache Web 服务器的一部分运行。

PHP 应用程序通过请求的 URL、所有表单数据和已捕获的任意会话信息从客户机获得信息,从而确定应该执行什么操作。如有必要,服务器会从 MySQL 数据库(也在 Linux 上运行)获得信息,将这些信息与一些 Hypertext Markup Language(HTML)模板组合在一起,并将结果返回给客户机。当用户在应用程序中导航时,这个过程重复进行;当多个用户访问系统时,这个过程会并发进行。但是,数据流不是单向的,因为可以用来自用户的信息更新数据库,包括会话数据、统计数据(包括投票)和用户提交的内容(比如评论或站点更新)。除了动态元素之外,还有静态元素,比如图像、JavaScript 代码和层叠样式表(CSS)。

在研究 LAMP 系统中的请求流之后,就来看看可能出现性能瓶颈的地方。数据库提供许多动态信息,所以数据库对查询的响应延迟都会反映在客户机中。Web 服务器必须能够快速地执行脚本,还要能够处理多个并发请求。最后,底层操作系统必须处于良好的状态才能支持应用程序。通过网络在不同服务器之间共享文件的其他设置也可能成为瓶颈。
 


LAMP 的变体

LAMP 最初是指 Linux、Apache、MySQL 和 PHP(或 Perl)。但是,如果管理员不擅长 Linux,那么可以在 Microsoft® Windows® 上运行 Apache、MySQL 和 PHP,这并非一种少见的情况。同样,也可以将 Apache 换成别的系统,比如 lighttpd,产生的仍然是 LAMP 风格的系统,但是首字母缩写不再是 LAMP 了。也可以改用另一种开放源码数据库(比如 PostgreSQL 或 SQLite)、商业数据库(比如 IBM® DB2®)或者免费的商业引擎(比如 IBM DB2 Express-C)。

本文主要关注传统的 LAMP 架构,因为这种架构是最常见的,而且它的组件都是开放源码的。


度量性能

持续地对性能进行度量在两个方面有帮助。首先,度量可以帮助了解性能趋势,包括好坏两方面的趋势。作为一个简单的方法,查看一下 Web 服务器上的中央处理单元(CPU)使用率,就可以了解 CPU 是否负载过重。同样,查看过去使用的总带宽并推断未来的变化,可以帮助判断什么时候需要进行网络升级。这些度量最好与其他度量和观测结合考虑。例如,当用户抱怨应用程序太慢时,可以检查磁盘操作是否达到了最大容量。

性能度量的第二个用途是,判断调优是对系统性能有帮助,还是使它更糟糕了。方法是比较修改之前和之后的度量结果。但是,为了进行有效的比较,每次应该只修改一个设置,然后对适当的指标进行比较以判断修改的效果。每次只修改一个设置的原因应该是很明显的:同时做出的两个修改很可能会相互影响。选择用来进行比较的指标比较微妙。

选择的指标必须能够反映应用程序用户感觉到的响应。如果一项修改的目标是减少数据库的内存占用量,那么取消各种缓冲区肯定会有帮助,但是这会牺牲查询速度和应用程序性能。所以,应该选择应用程序响应时间这样的指标,这会使调优向着正确的方向发展,而不仅仅是针对数据库内存使用量。

可以以许多方式度量应用程序响应时间。最简单的方法可能是使用 curl 命令,见清单 1。

清单 1. 使用 cURL 度量 Web 站点的响应时间


  1. $ curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total}\
  2. http://www.canada.com
  3. 0.081:0.272:0.779

清单 1 给出对一个流行的新闻站点执行 curl 命令的情况。输出通常是 HTML 代码,通过 -o 参数发送到 /dev/null。-s 参数去掉所有状态信息。-w 参数让 curl 写出表 1 列出的计时器的状态信息:

表 1. curl 使用的计时器

 

计时器描述
time_connect建立到服务器的 TCP 连接所用的时间
time_starttransfer在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
time_total完成请求所用的时间

 

 

这些计时器都相对于事务的起始时间,甚至要先于 Domain Name Service(DNS)查询。因此,在发出请求之后,Web服务器处理请求并开始发回数据所用的时间是 0.272 - 0.081 = 0.191 秒。客户机从服务器下载数据所用的时间是 0.779 -0.272 = 0.507 秒。


通过观察 curl 数据及其随时间变化的趋势,可以很好地了解站点对用户的响应性。

当然,Web 站点不仅仅由页面组成。它还有图像、JavaScript 代码、CSS 和 cookie 要处理。curl 很适合了解单一元素的响应时间,但是有时候需要了解整个页面的装载速度。

用于 Firefox 浏览器的 Tamper Data 扩展可以在日志中记录 Web 浏览器发出的每个请求,并显示每个请求所用的下载时间。

尽管关注的重点是页面装载时间和用户体验,但是也不要忽视核心系统指标,比如磁盘、内存和网络。有许多实用程序可以捕获这些信息;其中最有帮助的可能是 sar、vmstat 和 iostat。
 

基本系统调节

在对系统的 Apache、PHP 和 MySQL 组件进行调优之前,应该花一些时间确保底层 Linux 组件的运行正常。还应该对正在运行的服务进行缩减,只运行需要的那些服务。这不但是一种良好的安全实践,而且可以节省内存和 CPU 时间。

一些快速的内核调优措施

大多数 Linux 发布版都定义了适当的缓冲区和其他 Transmission Control Protocol(TCP)参数。可以修改这些参数来分配更多的内存,从而改进网络性能。设置内核参数的方法是通过 proc 接口,也就是通过读写 /proc 中的值。幸运的是,sysctl 可以读取 /etc/sysctl.conf 中的值并根据需要填充 /proc,这样就能够更轻松地管理这些参数。清单 2 展示在互联网服务器上应用于 Internet 服务器的一些比较激进的网络设置。
 

清单 2. 包含较为激进的网络设置的 /etc/sysctl.conf


  1. # Use TCP syncookies when needed
  2. net.ipv4.tcp_syncookies = 1
  3. # Enable TCP window scaling
  4. net.ipv4.tcp_window_scaling: = 1
  5. # Increase TCP max buffer size
  6. net.core.rmem_max = 16777216
  7. net.core.wmem_max = 16777216
  8. # Increase Linux autotuning TCP buffer limits
  9. net.ipv4.tcp_rmem = 4096 87380 16777216 
  10. net.ipv4.tcp_wmem = 4096 65536 16777216
  11. # Increase number of ports available
  12. net.ipv4.ip_local_port_range = 1024 65000




将这些设置添加到 /etc/sysctl.conf 的现有内容中。第一个设置启用 TCP SYN cookie。当从客户机发来新的 TCP 连接时,数据包设置了 SYN 位,服务器就为这个半开的连接创建一个条目,并用一个 SYN-ACK 数据包进行响应。在正常操作中,远程客户机用一个 ACK 数据包进行响应,这会使半开的连接转换为全开的。有一种称为 SYN 泛滥(SYN flood) 的网络攻击,它使 ACK 数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。SYN cookie 特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间。大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。

启用 TCP 窗口伸缩使客户机能够以更高的速度下载数据。TCP 允许在未从远程端收到确认的情况下发送多个数据包,默认设置是最多 64 KB,在与延迟比较大的远程客户机进行通信时这个设置可能不够。窗口伸缩会在头中启用更多的位,从而增加窗口大小。

后面四个配置项增加 TCP 发送和接收缓冲区。这使应用程序可以更快地丢掉它的数据,从而为另一个请求服务。还可以强化远程客户机在服务器繁忙时发送数据的能力。

最后一个配置项增加可用的本地端口数量,这样就增加了可以同时服务的最大连接数量。

在下一次引导系统时,或者下一次运行 sysctl -p /etc/sysctl.conf 时,这些设置就会生效。
 

配置磁盘来提高性能

磁盘在 LAMP 架构中扮演着重要的角色。静态文件、模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘。对磁盘的许多调优(尤其是对于数据库)集中于避免磁盘访问,因为磁盘访问的延迟相当高。因此,花一些时间对磁盘硬件进行优化是有意义的。

首先要做的是,确保在文件系统上禁用 atime 日志记录特性。atime 是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳。因为系统管理员很少使用 atime,禁用它可以减少磁盘访问时间。禁用这个特性的方法是,在 /etc/fstab 的第四列中添加 noatime 选项。清单 3 给出了一个配置示例。
清单 3. 演示如何启用 noatime 的 fstab 示例


  1. /dev/VolGroup00/LogVol00 /                     ext3    defaults,noatime        1 1
  2. LABEL=/boot            /boot                   ext3    defaults,noatime        1 2
  3. devpts                 /dev/pts                devpts  gid=5,mode=620  0 0
  4. tmpfs                  /dev/shm                tmpfs   defaults        0 0
  5. proc                   /proc                   proc    defaults        0 0
  6. sysfs                  /sys                    sysfs   defaults        0 0
  7. LABEL=SWAP-hdb2        swap                    swap    defaults        0 0
  8. LABEL=SWAP-hda3        swap                    swap    defaults        0 0

在清单 3 中只修改了 ext3 文件系统,因为 noatime 只对驻留在磁盘上的文件系统有帮助。为让这一修改生效,不需要重新引导;只需重新挂装每个文件系统。例如,为了重新挂装根文件系统,运行 mount / -o remount。

 

有多种磁盘硬件组合,而且 Linux 不一定能够探测出访问磁盘的最佳方式。可以使用 hdparm 命令查明和设置用来访问 IDE 磁盘的方法。hdparm -t /path/to/device 执行速度测试,可以将这个测试结果作为性能基准。为了使结果尽可能准确,在运行这个命令时系统应该是空闲的。清单 4 给出在 hda 上执行速度测试的结果。

清单 4. 在 /dev/hd 上执行的速度测试


  1. # hdparm -t /dev/hda

  2. /dev/hda:
  3. Timing buffered disk reads: 182 MB in  3.02 seconds =  60.31 MB/sec




这一测试说明,在这个磁盘上读取数据的速度是大约每秒 60 MB。

在尝试一些磁盘调优选项之前,必须注意一个问题。错误的设置可能损害文件系统。有时候会出现一个警告,指出这个选项与硬件不兼容;但是,有时候没有警告消息。因此,在将系统投入生产之前,必须对设置进行彻底的测试。在所有服务器上都采用标准的硬件也会有所帮助。


表 2 列出比较常用的一些选项。


表 2. hdparm 的常用选项

选项描述
-vi向磁盘查询它支持的设置以及它正在使用的设置。
-c查询/启用 (E)IDE 32 位 I/O 支持。hdparm -c 1 /dev/hda 启用这个设置。
-m查询/设置每中断多扇区模式。如果设置大于零,设置值就是每个中断可以传输的最大扇区数量。
-d 1 -X启用直接内存访问(DMA)传输并设置 IDE 传输模式。hdparm 手册页详细说明了在 -X 后面可以设置的数字。只有在 -vi 说明目前并未使用最快速的模式的情况下,才需要进行这个设置。




不幸的是,对于 Fiber Channel and Small Computer Systems Interface(SCSI)系统,调优依赖于具体的驱动器。必须将有帮助的设置添加到启动脚本中,比如 rc.local。

 

网络文件系统调优


网络文件系统(NFS)是一种通过网络共享磁盘的方法。NFS 可以帮助确保每个主机具有相同数据的拷贝,并确保修改反映在所有节点上。但是,在默认情况下,NFS 的配置不适合大容量磁盘。

每个客户机应该用 rsize=32768,wsize=32768,intr,noatime 挂装远程文件系统,从而确保:

  * 使用大的读/写块(数字指定最大块大小,在这个示例中是 32KB)。
  * 在挂起时 NFS 操作可以被中断。
  * 不持续更新 atime。


可以将这些设置放在 /etc/fstab 中,见 清单 3。如果使用自动挂装器,那么应该将这些设置放在适当的 /etc/auto.* 文件中。

在服务器端,一定要确保有足够的 NFS 内核线程来处理所有客户机。在默认情况下,只启动一个线程,但是 Red Hat 和 Fedora 系统会启动 8 个线程。对于繁忙的 NFS 服务器,应该提高这个数字,比如 32 或 64。可以用 nfsstat -rc 命令评估客户机,了解是否有阻塞的现象,这个命令显示客户机远程过程调用(RPC)统计数据。清单 5 显示一个 Web 服务器的客户机统计数据。

清单 5. 显示 NFS 客户机的 RPC 统计数据


  1. # nfsstat -rc
  2. Client rpc stats:
  3. calls     retrans    authrefrsh
  4. 1465903813  0          0

第二列 retrans 是零,这表示从上一次重新引导以来没有出现需要重新传输的情况。如果这个数字比较大,就应该考虑增加 NFS 内核线程。设置方法是将所需的线程数量传递给 rpc.nfsd,比如 rpc.nfsd 128 会启动 128 个线程。任何时候都可以进行这种设置。线程会根据需要启动或销毁。同样,这个设置应该放在启动脚本中,尤其是在系统上启用 NFS 的脚本。

关于 NFS,最后要注意一点:如果可能的话,应该避免使用 NFSv2,因为 NFSv2 的性能比 v3 和 v4 差得多。在现代的 Linux 发行版中这应该不是问题,但是可以在服务器上检查 nfsstat 的输出,了解是否有任何 NFSv2 调用。

用shell脚本进行MySQL数据库定时备份

来自:http://tieniuzai.com/

对任何一个已经上线的电子商务站点来说,数据备份都是必须的。无论版本更新还是服务器迁移,备份数据的重要性不言而喻。人工备份数据的方式不单耗费 大量时间和精力,还灰常不专业的说。于是,有了下面这段脚本的出现。参考了网上的很多教程,外加自己的测试,以下脚本测试可用。

#!/bin/bash
#Shell Command For Backup MySQL Database Everyday Automatically By Crontab
#Author : Carlos Wong
#Date : 2010-08-24

#配置参数
USER=root #数据库用户名" >用户
PASSWORD=××××× #数据库用户密码
DATABASE=TIENIUZAI    #数据库名称
WEBMASTER=tieniuzai@qq.com #管理员邮箱地址,用以发送备份失败消息提醒
BACKUP_DIR=/var/www/Data_Backup/topons/ #备份文件存储路径
LOGFILE=/var/www/Data_Backup/topons/data_backup.log #日记文件路径
DATE=`date ‘+%Y%m%d-%H%M’` #日期格式(作为文件名)
DUMPFILE=$DATE.sql #备份文件名
ARCHIVE=$DATE.sql.tgz #压缩文件名
OPTIONS=”-u$USER -p$PASSWORD –opt –extended-insert=false –triggers=false -R –hex-blob –flush-logs –delete-master-logs -B $DATABASE”  #mysqldump 参数 详情见帮助 mysqldump -help

#判断备份文件存储目录是否存在,否则创建该目录
if [ ! -d $BACKUP_DIR ] ;
then
mkdir -p “$BACKUP_DIR”
fi

#开始备份之前,将备份信息头写入日记文件
echo ” ” >> $LOGFILE
echo ” ” >> $LOGFILE
echo “———————————————–” >> $LOGFILE
echo “BACKUP DATE:” $(date +”%y-%m-%d %H:%M:%S”) >> $LOGFILE
echo “———————————————– ” >> $LOGFILE

#切换至备份目录
cd $BACKUP_DIR
#使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件
mysqldump $OPTIONS > $DUMPFILE
#判断数据库备份是否成功
if [[ $? == 0 ]]; then
#创建备份文件的压缩
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
#输入备份成功的消息到日记文件
echo “[$ARCHIVE] Backup Successful!” >> $LOGFILE
#删除原始备份文件,只需保 留数据库备份文件的压缩包即可
rm -f $DUMPFILE
else
echo “Database Backup Fail!” >> $LOGFILE

#备份失败后向网站管理者发送邮件提醒,需要mailutils或者类似终端下发送邮件工具的支持
#mail -s “Database:$DATABASE Daily Backup Fail” $WEBMASTER
fi
#输出备份过程结束的提醒消息
echo “Backup Process Done”

使用:

  1. 将以上代码保存到: /usr/sbin/DataBackup     (文件名随意,只要不跟系统原有的命令同名即可;代码可以放到任何地方,放在sbin目录下只是为了方便执行,sbin目录下的文件/目录可在终端直接调 用,类似于windows下PATH变量指定的目录)
  2. 脚本添加可执行权限:  sudo chmod +x  /usr/sbin/DataBackup
  3. 执行脚本: sudo  DataBackup
  4. 如果需要定时执行备份命令的,只需将下面这段代码放到crontab 文件(sudo vim /etc/crontab)中去就可以了:

01 3 * * * root /usr/sbin/DataBackup    #它代表着将于每天3点执行DataBackup脚本

小注意一下下:

  1. linux 下的shell脚本定义变量的格式为:  key=value  ,注意他们两者之间的” = “前后不能出现空格,否则系统无法确认该变量。
  2. 红色标注的那行,第一个类似单引号的字符”`”其实不是单引号,它的输入键在键盘ESC键下方。
  3. 这个脚本只适合用于一些小站点的备份,因为它是对数据库进行全部备份而不是增量备份,不适合大容量的数据库备份。

Update:

2010-08-24  :  由于服务器上的MySQL配置文件里 的socket项值为 “/tmp/mysql.sock”, 而mysqldump在链接mysql server的时候会去查找位于/var/lib/mysql/目录下的mysql.sock文件。如果没有则会报错:

mysqldump: Got error: 2002: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

解决方法是:一是,修改mysql配置文件里的socket项的值为  ’/var/lib/mysql/mysql.sock’,不过这种方法需要重启mysql服务,很不厚道。

二是,为/tmp/mysql.sock创建一个软链接到/var/lib/mysql/mysql.sock:

ln  -s  /tmp/mysql.sock   /var/lib/mysql/mysql.sock

linux 里的mysql命令总结 - 学习linux+mysql必备

一、总结一下Linux下MySQL的一些命令:

1.Linux下启动mysql的命令:
mysqladmin start
/ect/init.d/mysql start (前面为mysql的安装路径)

2.Linux下重启mysql的命令:
mysqladmin restart
/ect/init.d/mysql restart (前面为mysql的安装路径)

3.Linux下关闭mysql的命令:
mysqladmin shutdown
/ect/init.d/mysql shutdown (前面为mysql的安装路径)

4.连接本机上的mysql:
进入目录mysql\bin,再键入命令mysql -uroot -p, 回车后提示输入密码。
退 出mysql命令:exit(回车)

5.修改mysql密码:
mysqladmin -u用户名 -p旧密码 password 新密码
或进入mysql命令行 SET PASSWORD FOR root=PASSWORD("root");

6.增加新用户。(注意:mysql环境中的命令后面都带一个分号作为命令结束符)
grant select on 数据库.* to 用户名@登录主机 identified by "密码"
如增加一个用户test密码为123,让他可以在任何主机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
grant select,insert,update,delete on *.* to " Identified by "123";

二、有关mysql数据库方面的操作
必须首先登录到mysql中,有关操作都是在mysql的提示符下进行,而且每个命令以分号结束

1、显示数据库列表。
show databases;
2、显示库中的数据表:
use mysql; //打开库
show tables;
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名(字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、 显示表中的记录:
select * from 表名;

9、编码的修改
如果要改变整个mysql的编码格式:
启动mysql的时候,mysqld_safe命令行加入
--default-character-set=gbk

如果要改变某个库的编码格式:在mysql提示符后输入命令
alter database db_name default character set gbk;

三、数据的导入导出

1、文本数据转到数据库中
文本数据应符合的格式:字段数据之间用tab键隔开,null值用来代替。例:
1 name duty 2006-11-23
数据传入命令 load data local infile "文件名" into table 表名;

2、导出数据库和表
mysqldump --opt news > news.sql(将数据库news中的所有表备份到news.sql文件,news.sql是一个文本文件,文件名任取。)

mysqldump --opt news author article > author.article.sql(将数据库news中的author表和article表备份到author.article.sql文件, author.article.sql是一个文本文件,文件名任取。)
mysqldump --databases db1 db2 > news.sql(将数据库dbl和db2备份到news.sql文件,news.sql是一个文本文件,文件名任取。)
mysqldump -h host -u user -p pass --databases dbname > file.dump
就是把host上的 以名字user,口令pass的数据库dbname导入到文件file.dump中
mysqldump --all-databases > all-databases.sql(将所有数据库备份到all-databases.sql文件,all-databases.sql是一个文本文件, 文件名任取。)

3、导入数据
mysql < all-databases.sql(导入数据库)
mysql>source news.sql;(在mysql命令下执行,可导入表)

一、连接MySQL
格式: mysql -h主机地址 -u用户名 -p用户密码

1、例1:连接到本机上的MYSQL。

首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>。

2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键 入以下命令:

mysql -h110.110.110.110 -uroot -pabcd123

(注:u与root可以不用加空格,其它也一样)

3、退出MYSQL命令: exit (回车)。

thinkphp 使用技巧总结 - 快速入门

在比较了下Zend Framework、CakePHP等框架后,我认为ThinkPHP的开发效率最高,代码最为简洁,最适合中小型项目开发。


1. 模板中不能使用的标签
{$content} {$i}
2. If标签
如: <if condition="$name eq 1 ">
试验后总是有想不到的错误, 这样,还不如直接用<?php if(...){ ...?>来得快些呢.

约定:
1.所有类库文件必须使用.class.php作为文件后缀,并且类名和文件名保持一致
2.控制器的类名以Action为后 缀
3.模型的类名以Model为后缀,类名第一个字母须大写
4.数据库表名全部采用小写,

如:
数据表名: 前缀_表名
模型类名: 表名Model 注:这里的表名第一个字母要大写
创建对象: D('表名') 注:这里的表名第一个字母要大写

定义控制器类
class IndexAction extends Action{
    public function show(){
        echo '这是新的 show 操作';
    }
}
然后在浏览器里面输入
http://localhost/myApp/index.php/Index/show/


定义模型类:
class 表名Model extends Model{
[//手动定义字段[可选]
    protected $fields = array(
    'id',
    'username',
    'email',
    'age',
    '_pk'=>'id', //主键
    '_autoInc'=>true //是否自增
    )
]
}

记录的修改:
$User = D("User") // 实例化 User 对象
$User->find(1) // 查找 id 为 1 的记录
$User->name = 'ThinkPHP' // 把查找到的记录的名称字段修改为 ThinkPHP
$User->save() // 保存修改的数据
更新特定字段的值
$User->setField('name','TopThink','id=1')
同 样可以支持对字段的操作
$User->setField('score','(score+1)','id=1')


新建记录,方法1:
$User = new UserModel() //实例化 User 对象
$User->字 段名 = 字段值 //给字段赋值
$User->add() //添加记录
新建记录,方法2:
$data['字段名'] = 字段值; //给字段赋值
$User = D('User'); //实例化 User 对象
$User->add($data); //$insertId,Add 方法的返回值就是最新插入的主键值,可以直接获取。
新增多条记录:
$User = new UserModel()
$data[0]['name'] = 'ThinkPHP'
$data[0]['email'] = 'sjolzy@chen.com'
$data[1]['name'] = '流年'
$data[1]['email'] = 'chen@sjolzy.cn'
$User>addAll($data)


删除记录
$User->find(2)
$User->delete() // 删除查找到的记录
$User->delete('5,6') // 删除主键为 5、6 的数据
$User->deleteAll() // 删除查询出来的所有数据

记录查询

$User->getDbFields() //获取当前数据字段
$User->findAll(); //查找所有记录
$User->findAll('1,3,8') //查询主键为1,3,8的记录集
$User->count() // 获取记录数
$User->max('score') // 获取用户的最大积分
$User->min('score','score>0') // 获取积分大于 0 的用户的最小积分
$User->avg('字段名') // 获取所有记录的字段值的平均值
$User->sum('字段名 ') // 统计字段值
$User->getN(2,'score>80','score desc') // 返回符合条件的第 2 条记录
$User->getN(2,'score>80','score desc') //还可以获取最后第二条记录
$User->first('score>80','score desc') //如果要查询第一条记录,还可以使用
$User->last('score>80','score desc') // 获取最后一条记录
$User->top(5,'','score desc') // 获取积分最高的前 5 条记录
$User->getBy('name','liu21st') //跟据字段的字段值来查询记录

$Model = new Model() // 实例化一个 model 对象 没有对应任何数据表
$Model->query("select * from think_user where status=1")

$objrs = $Model->query("select * from think_user where status=1") //自定义查询
$Model->execute("update think_user set name='thinkPHP' where status=1") //用于更新和写入数据的 sql 操作,返回影响的记录数


$User->startTrans() // 启动事务
$User->commit() // 提交事务
$User->rollback() // 事务回滚

模板:

$this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论何种变量类型都统一使用 assign 赋值

$this->display() // 输出模版文件

批量赋值
$array['name'] = 'thinkphp'
$array['email'] = 'chen@sjolzy.cn'
$array['phone'] = '12335678'
$this->assign($array)


$this->display() // 调用 User 模块的 read 操作模版
$this->display('edit') // 调用 User 模块的 edit 操作模版
$this->display('Member:read') // 调用 Member 模块的 read 操作模版
$this->display('Xp@User:edit') // 调用 Xp 主题的 User 模块的 edit 操作模版
$this->display('../Member/read.html') // 直接指定模版文件的全名

模板标签:

{ } 或 {// 注释内容 } //模板注释
{$user['name']} //输出数组变量
{$user:name} //输出对象的属性

为了方便模板定义,无论输出的模板变量是数组还是对象,都可以用下列统一方式输出:
{$user.name}
如果是多维数组或者多 层对象属性的输出,请使用下面的定义方式:
{$user['sub']['name']}
{$user:sub:name}

使用函数:
格式:{$varname|function1|function2=arg1,arg2,### }
说明:
{ 和 $ 符号之间不能有空格 ,后面参数的空格就没有问题
###表示模板变量本身的参数位置

系统变量
{$Think.server.script_name } //取得$_SERVER 变量
{$Think.session.session_id|md5 } // 获取$_SESSION 变量
{$Think.get.pageNumber } //获取$_GET 变量
{$Think.cookie.name } //获取$_COOKIE 变量
系统常量
{$Think.const.__FILE__ }
{$Think.const.MODULE_NAME }
特殊变量 ,由 ThinkPHP 系统定义的常量
{$Think.version } //版本
{$Think.now } //现在时间

快捷输出
{:function(…)} //执行方法并输出返回值
{~function} //执行方法不输出
{@var} //输出 Session 变量
{&var} //输出配置参数
{%var} //输出语言变量
{.var} //输出 GET 变量
{^var} //输出 POST 变量
{*var} //输出常量

包含外部文件
<include file="$tplName" /> // 用变量控制要导入的模版
<include file="../Public/header.html" /> // 使用一个完整的文件名包含

循环输出
iterate 还有其它的别名,包括 volist,resultset,sublist

模版赋值:
$User = D('User')
$list = $User->findAll()
$this->assign('list',$list)

模版定义:
<iterate name="list" id="vo">
{$vo.name}
</iterate>

注意 name 和 id 表示的含义
// 输出 list 的第 5~15 条记录
<iterate name="list" id="vo" offset="5" length='10'>
{$vo.name}
</iterate>

// 输出偶数记录
<iterate name="list" id="vo" mod="2" >
<eq name="mod" value="1">
{$vo.name}
</eq>
</iterate>

// 输出 key
<iterate name="list" id="vo" key="k" >
{$k}.{$vo.name}
</iterate>

//子循环输出
<volist name="list" id="vo">
<sublist name="vo['sub']" id="sub">
{$sub.name}
</sublist>
</volist>

Switch 标签
<switch name="name">
<case value="1">value1</case>
<case value="2">value2</case>
<default />default
</switch>
其 中 name 属性可以使用函数以及系统变量,例如:
<switch name="Think.get.userId|abs">
<case value="1">admin</case>
<default />default
</switch>
也 可以对 case 的 value 属性使用变量,例如:
<switch name="userId">
<case value="$adminId">admin</case>
<case value="$memberId">member</case>
<default />default
</switch>

比较标签
<eq name="name" value="value">value</eq> // name 变量的值等于 value 就输出
<neq name="name" value="value">value</neq> // name 变量的值不等于 value 就输出
<gt name="name" value="5">value</gt> // name 变量的值大于 5 就输出
<egt name="name" value="5">value</egt> // name 变量的值大于等于 5 就输出
<lt name="name" value="5">value</lt> // name 变量的值小于 5 就输出
<elt name="name" value="5">value</elt> // name 变量的值小于等于 5 就输出


//其实上面的所有标签都是 compare 标签的别名
// 其中 type 属性的值就是上面列出的判断标签名称
<compare name="name" value="5" type="eq">value</compare> // name 变量的值等于 5 就输出

If标签
<if condition="$name eq 1 "> value1
<elseif condition="$name eq 2" />value2
<else /> value3
</if>

C操作
操作(动态)配置: 主要用于Action方法里面
获取:
C('配置参数')
设置:
C('配置参数 ',新值)

A操作
快速创建Action对象:
$action = A('User');
等效于
$action = new UserAction();

D操作
快速创建模型数据对象:
$model = D('User');
等效于
$model = new UserModel();

S操作
快速操作缓存方法
获取:
S('name')
设置:
S('name','value');
删 除:
S('name',NULL);

F操作
快速文件数据保存方法
使用方法与S操作一样


L操作
快速操作语言变量
获取:
L('语言变量');
设置:
L('语言变量','值');
如: L('USER_INFO','用户信息'); //设置名称为USER_INFO的语言变量
批量赋值:
$arr['语言变量1'] = '值1';
$arr['语言变量2'] = '值2';
L($arr);


Create PROCEDURE procedure1

(IN parameter1 INTEGER)

BEGIN

DECLARE variable1 CHAR(10);

IF parameter1 = 17 THEN

SET variable1 = 'birds';

ELSE

SET variable1 = 'beasts';

END IF;

Insert INTO table1 VALUES (variable1);

END

ThinkPHP系统常量

THINK_PATH   // ThinkPHP 系统目录
APP_PATH   // 当前项目目录
APP_NAME   // 当前项目名称
MODULE_NAME   //当前模块名称
ACTION_NAME   // 当前操作名称
TMPL_PATH   // 项目模版目录
LIB_PATH   // 项目类库目录
CACHE_PATH   // 项目模版缓存目录

CONFIG_PATH   //项目配置文件目录
LOG_PATH   // 项目日志文件目录
LANG_PATH   // 项目语言文件目录
TEMP_PATH   //项目临时文件目录
PLUGIN_PATH   // 项目插件文件目录
VENDOR_PATH   // 第三方类库目录
DATA_PATH   // 项目数据文件目录
IS_APACHE   // 是否属于 Apache
IS_IIS    //是否属于 IIS
IS_WIN    //是否属于Windows 环境
IS_LINUX   //是否属于 Linux 环境
IS_FREEBSD   //是否属于 FreeBsd 环境
NOW_TIME   // 当前时间戳
MEMORY_LIMIT_ON // 是否有内存使用限制

MEMORY_LIMIT_ON // 是否有内存使用限制
OUTPUT_GZIP_ON   // 是否开启输出压缩
MAGIC_QUOTES_GPC // MAGIC_QUOTES_GPC
THINK_VERSION   //ThinkPHP 版本号
LANG_SET   // 浏览器语言
TEMPLATE_NAME   //当前模版名称
TEMPLATE_PATH   //当前模版路径
__ROOT__   // 网站根目录地址
__APP__   // 当前项目(入口文件)地址
__URL__   // 当前模块地址
__ACTION__   // 当前操作地址
__SELF__   // 当前 URL 地址
TMPL_FILE_NAME   //当前操作的默认模版名(含路径)
WEB_PUBLIC_URL   //网站公共目录
APP_PUBLIC_URL   //项目公共模版目录

预定义常量
WEB_LOG_ERROR=0     // 错误日志类型
WEB_LOG_DEBUG=1 // 调试日志类型
SQL_LOG_DEBUG=2   // SQL 日志类型
SYSTEM_LOG=0   // 系统方式记录日志
MAIL_LOG=1   // 邮件方式记录日志
TCP_LOG=2   // TCP 方式记录日志
FILE_LOG=3   // 文件方式记录日志
DATA_TYPE_OBJ=1 // 对象方式返回
DATA_TYPE_ARRAY=0 // 数组方式返回
URL_COMMON=0   // 普通模式 URL
URL_PATHINFO=1   // PATHINFO URL
URL_REWRITE=2   // REWRITE URL
HAS_ONE=1   // HAS_ONE 关联定义
BELONGS_TO=2   // BELONGS_TO 关联定义
HAS_MANY=3   // HAS_MANY 关联定义
MANY_TO_MANY=4   // MANY_TO_MANY 关联定义
EXISTS_TO_VAILIDATE = 0 // 表单存在字段则验证
MUST_TO_VALIDATE = 1 // 必须验证
VALUE_TO_VAILIDATE = 2 // 表单值不为空则验证

关于XML的几点知识以及详细解释XML的CDATA是什么

XML解析数据

XML 解析器通常情况下会处理XML文档中的所有文本。

当XML元素被解析的时候,XML元素内部的文本也会被解析:

<message>This text is also parsed</message>

XML解析器这样做的原因是XML元素内部可能还包含了别的元素,象下面的例子,name元素内部包含了first和last两个元素:

<name><first>Bill</first><last>Gates</last></name>

XML解析器会认为上面的代码是这样的:

<name>
  <first>Bill</first>
  <last>Gates</last>
</name>


转义字符

不合法的XML字符必须被替换为相应的实体。

如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该象下面那样书写代码:

<message>if salary < 1000 then</message>

为了避免出现这种情况,必须将字符"<" 转换成实体,象下面:

<message>if salary &lt; 1000 then</message>

下面是五个在XML文档中预定义好的实体:
 

&lt;<小于号
&gt;>大于号
&amp;&
&apos;'单引号
&quot;"双引号

实体必须以符号"&"开头,以符号";"结尾。

注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。


XML的CDATA部件

在CDATA内部的所有内容都会被解析器忽略。

如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。

一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束:

<script>
<![CDATA[
function matchwo(a,b){
if (a < b && a < 0) then{
    return 1
}else{
    return 0
}
}
]]>
</script>

在前面的例子中,所有在CDATA部件之间的文本都会被解析器忽略。

CDATA注意事项:

1.CDATA部件之间不能再包含CDATA部件(不能嵌套)。如果CDATA部件包含了字符"]]>" 或者"<![CDATA[" ,将很有可能出错哦。

2.同样要注意在字符串"]]>"之间没有空格或者换行符。

<![CDATA[ ]]>是什么意思???
=================================================

标明是纯文本的,没有这个的话 <  >  & 字符是不能直接存入XML的,需要转义,而用这个标记则不需要转义而将这些符号存入XML文档。
可以避免未预 料的特殊符号导致XML解析出错。

c#涉及到关于XML的CDATA和验证有效性的问题
我 刚开始学习XML的东西,这里面我遇到一个叫做CDATA的段。这里面的解释是在CDATA里面的所有东西都会被解析器忽略我不清楚这是什么意思。用简单 的话来说就是CDATA什么时候用,这里面的东西有什么用。如果用这个了,会产生什么样子的结果。
还有就是XML有效性的验证。这个是什么意 思,为什么要验证有效性呢,一般怎么验证呢,方法如何?我看书上说有DTD和XML Schema的两个方法,如何用,有什么区别呢?
问题虽然 多了点,但是就是两个主要的问题。希望知道的大侠帮帮小弟,用通俗简单一点的话告诉我。万分感谢。
==================================================

当你用FLASH和xml结合做网站应用程序时,例如让人自由输入姓名时,人们可以输入一些符号,例如 ∶"<"、">"、"/"、"?"等,当生成XML时,会破坏了XML结构,使数据中断。

这就要用XML CDATA

在 XML文档中的所有文本都会被解析器解析。

只有在CDATA部件之内的文本会被解析器忽略。

<![CDATA[ ]]>是什么意思?~

从数据库里读取数据生成XML文 件,加个“<![CDATA[    ]]>“是什么意思?
Response.Write "<body><![CDATA["
Response.Write rs("message")
Response.Write "]]></body>"
============================================

标明是纯文本的,没有这个的话 <  >  & 字符是不能直接存入XML的,需要转义,而用这个标记则不需要转义而将这些符号存入XML文档。

可以避免未预料的特殊符号导致XML解析 出错。

 

 

PCDATA和CDATA的区别究竟是什么呢?
=============================================
PCDATA 表示已解析的字符数据。
   CDATA是不通过解析器进行解析的文本,文本中的标签不被看作标记。
   CDATA表示里面是什么数据XML不会解析.比如可能是下面的一段
   <![CDATA[
       if(a>b){
          System.out.println(a);
     }

     ]]>

    注意上面的一个">"符号.


    PCDATA的数据是要给XML解析器去解析的,那上面的>去解析肯定会出错了,所以要用实体定义.上面的数据如果用PCDATA表示如下:

      if(a&gt;b){
         System.out.println(a);
      }

     cdata是在XML文档里面使用的关键字,用来告诉浏览器,这部分内容不用解析,是给其他程序用的,比如JAVASCRIPT等等,#PCDATA是在 XML约束文档里使用的,如DTD类型的约束文档,在这里面表示元素的内容或属性的取值范围等等,是字符串形式的