Mysql学习笔记
时间:2007-04-07 来源:sailboy
Mysql入门到精通
安装Mysql
tar xxfv mysql-xx
cd mysql-xx
make
make isntall
./script/mysql_install_db
启动和停止
mysqladmin version
mysqlshow
service mysql start
/etc/rc.d/init.d/mysqld start
mysqld_safe&
Mysql启动测试
locate safe_mysqld locate在linux下找一个脚本
mysqladmin ping 检测是否在工作
mysqladmin version Mysql版本号
mysqlshow 查看有多少数据库
刚安装完后有两个数据库
Mysql用户管理
增加一个用户test_user密码为123,
grant select,insert,update,delete on *.* to 'test_user'@'localhost' identikfied by '123';
use mysql
grant select,insert,update,delete on *.* to 'romote'@'%' identikfied by 'remote'
grant(vt同意,)语句创建Mysql用户并指定其权限,而revoke(vt,撤回,废除,宣告无效)语句删除权限,grant和revoke影响两个表
user,db数据库权限,tables_priv表的权限,columns_priv列级权限
use mysql;
delete from User where User=""; //删除没有必要的用户
update User set Password=PASSWORD('newpassword') where User='root' //更改用户的密码
update User set Password=PASSWORD('king') where User='remote'
如果要更改登陆终端,更新User表中相应用户的Host字段
平时不要用root用户管理mysql,Mysql的用户管理是通过User表来实现的,添加新用户常用有两个,一是在User表插入相应的数据行,同时设置权限;二是通过grant命令创建具有某种权限的用户.
grant的语法:
privileges(n特权,特别待遇,基本公民权利);
identified(vt识别,鉴别,把..和..看成一样v确定)
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
(管理权限)
grant all on sailboy.* to NewUserName@HostName identified by "password";
grant all on *.* to postfix@localhost identified by "postfix";
grant usage on *.* to NewUserName@HostName identified by "password"; 只允许登录--其它什么也不允许做。
grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
grant update,delete on mydb.TestTable to NewUserName
grant all on *.* to remote@localhost identified by "king";
REVOKE ALL on sailboy.* FROM reomote@'%';
REVOKE grant option on dbaaa.* FROM aaa@localhost;
若要给次用户赋予他相应对象上的权限的管理能力,可以grant后面添加with grant option选项
要是添加用户密码要使用函数PASSWORD
回收权限可以更改User,或REVOKE
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
连接的mysql mysql -h主机 -u用户名 -p密码
show tables; 查看有多少表
show databases; /*可以加入注释*/ 要以分号结束
# 单行注释
use mysql;
show talbes;
describe/desc 表名; 显示数据表的结构
desc user; 查看用户的详细信息
desc user;用户表结构
exit 退出Mysql
MySQL DCL入门 数据控制语言
每一张表有三个文件
create database school;
drop database school;
写的更严禁
drop database if exists school; # 如果
建表
use school;
create table teacher #建立教师情况表Teacher
(
Id int(5) auto increment not null primary key,
name char(10) not null,
address varchar(50) default '武汉大学',
year date
)
删除表
drop table teacher;
select * from jokes;
select id,jokedate form jokes;
select id,left(joketext,20),jokedate from jokes; 看joketext的前20字符
select count(*) from jokes;统计有多少条记录
PhpMyAdmin的使用
Mysql字符串和数字
ANSI字符串因该为''引号,""在mysql兼容
\n表示换行符
select 岩石引号和转意
select (100+98+99)/3; 当计算器
select 'hello','"hello"',""hello"",'hel"lo','\'hello';
数字
有效的浮点的例子
-32023.6809e+10
select hex('cat');
数字类型
准确类型 integer(int),smallint,tinyint和bigint 近似数字类型
商品价格 888.88 price decimal(5,2) 表示总长度:5,小数位:2
Mysql函数
比较运算符 = != <>,>,>=,<,<=
null安全等于比较 <=>
is null,is not null,isnull(expr) 是不是空
expr between min and max 如果expr大于或等于min,并且expr小于或等于 max,between返回1,否则返回0,它等价与表达式(min <=expr and expr <=max)
expr in(v1,v2,......) 如果expr是in列表中的一值,它将返回1,否则返回0。
在sql中,所有的逻辑预算符返回的值均为true,false或null(未知)。在mysql中,它们由1(true),0(false)和null实现。
not或! 逻辑非。如果操作数为0,返回1;如果操作数为非零,返回0
select not 10; //10为非零为真,反过来0 非零为真,0为假
select ! (1+1); //1+1=2 2不是零为真,反过来为假,显示为0
select ! 1+1; select (!1)+1
and或&& 逻辑与。如果所有的操作数都是非零或非null的,返回1;如果有一个或多个操作数为0,则返回0;只要操作数中有null返回值就是null
or或|| 逻辑或 如果任何一个操作数是非零的,返回值为1,如果任一操作数为null,返回值为null,否则返回0.
xor 逻辑异或, 如果人一操作数为null,返回值为null.对于非null的操作数,如果有奇书数个非零的操作数,结果返回为1,否则返回0。
1(true)0(false)或NULL.
null安全等于比较<=>
is null,is not null,isnull(expr)
expr between num and max
如果expr大于或等于min,并且expr小于或等于max,between返回1,否则返回0。它等价于表达式(min<=expr and expr<=max)
expr in(v1,v2,...)
如果expr是in列表中的一值,它返回1,否则返回0
ifnull(expr1,value) 如果expr1为非null的,ifnull()返回value,否则返回expr1.ifnull ()返回一个数字或字符串值,这取决它所使用的情况,用在统计时候
select ifnull(1,0); 1
select ifnull(null,0); 10
select ifnull(1/0,10); 10
select ifnull(1/0,'yes'); 'yes'
case value when [compare-value] then result [when[compare-value]] then result...][slse result] end
case when[condition] then result [when[condition] then result ...][else result] end
if(expr1,expr2,expr3) 如果expr1为真(expr1<>0以及expr1<>null),那么if()返回 expr2,否则返回expr3.if()返回一个数字或字符串,这取决于 它被使用的语境;
select if(1>2,2,3); 3
select if(1<2,'yes','no'); 'yes'
nullif(expr1,expr2) 比较两个表达式 如果expr1=expr2为真,返回null,否则返回expr1.
它等同于case when expr1 = expr2 then ull else expr1 end;
select nullif(1,1); null
select nullif(1,2); 1
优先级
:=
||,or,xor
&&,and
between,case,when,then,else
= <=>,<=,like,regexp,in,<,>,<=
|
&
<<,>>
-,+
,/div,%,mod,
^
not,!
Mysql字符串函数;
select ASCII('2');
select ASCII(2);
select bin(12); //二进制转换
ort(12); 八
hex(12) 十六
char() 以整数类型即使参数,返回这个整数所代表的ascii码值给出的字符组成的字符串, null值将被忽略.
select char(77,121,83,81,'76'); //翻译成ACCEII码 MySQL
length(str) 返回字符串str的的字节数。 char_length(str)
select length('test'); 4
concat(str1,str2...) 将参数连成字符串返回。如果有任何一个参数为null,返回值为null.可以有超过2个的参数。数字参 数将被转换为相等价的字符串形式。 里面有一个是空,返回为空
select concat('my','s','ql'); mysql
locate(子串substr,母串str) 返回子串substr在字符串str中第一次出现的位置,如果找不到,返回为0
select locate('bar','foobarbar'); 4 第一次出现的位置
select locate('xbar','foobar'); 0
instr(str,substr) 返回子串str中第一次出现的位置,和locate()相似,参数颠倒
select instr('foobarbar','bar'); 4
lpad(str,len,padstr) 用字符串padstr对str进行左边填补直至它的长度到达len个字符长度,然后返回str.如果str的长度长于len,那么它将被截除len个字符
select lpad('hi',4,'??'); // '??hi'
rpad(str,len,padstr) 用字符串padstr对str进行右边填补直至它的长度到达len个字符长度,然后返回str.如果str的长度长于len,那么它将被截除 len个字符
select rpad('hi',5,'?'); // 'hi???'
left(str,len) 返回字符串 str中最左边的len个字符
select right
SELECT语法
数据选择 select 列1,列2,...from 表1,表2,...
select joketext form jokes where joketext like "%鞋%"; %表示任意字符串
select joketext form jokes where joketext like "_鞋_"; _表示任意一个字符串
分组函数
员工表 emp(empno,name,tel,deptno,sal)
部门表 dept(depton,dame,addr)
显示每个部门的最高工资
select depton.max(sal) for emp group bydeptno;
Mysql数据定义语言DDL
创建数据库格式: 建库
create database [if not exists] 数据库名
create database if not exists test;
create database question;
删除数据库个是:drop database [if exists] 数据库名
Mysql的表 一个表实际上对应三个文件 xx.MYD xx.MYI xx.frm
create table 表名(
列1 类型[选项],
列2 类型[选项],
....
)
数据库数据目录 lib/mysql/ *.frm 表格式定义文件,*.myd数据文件,*.myi索引文件
create database school;
create talbe test(
a int,
b int
)
例子:
Mysql数据库的数据存放的主体是表(table)
建表:
create database school;
use school;
create table teacher #建立教师情况表
(
Id int(5) auto_increment not null primary key;
name char(10) not null,
address varchar(50) default '武汉大学',
year date
);
auto_increment每个记录自动加一,primary key主字段
drop table teacher; 删除表
修改表结构:
alert table 表1 rename 表2; //更改表名称
alert talbe t2 modify a tinyint not null,change b c char(20);
//为了改变列a,从integer改为tinyint not null(名字一样),并且改变列b,从char(10)改为char(20),同时重命名,从b改为c;
alert table t2 add d timestamp; //新增一个新timestamp列,名为d;
alert table t2 add c int auto_increment,add index(c);
//增加一个新的auto_inerement整数列,命名为e;我们用索引了c,因为auto_increment列必须被索引
alert table t2 drop columm c; //删除列c
desc table名字
Mysql视图
create table t(qty int,price int);人缘
insert into t values(3,50);
create view v as select qty,price,qty,price,qty*price as values from t;
select * from v;
Mysql索引
添加/删除匿名索引
在列d上增加一个索引,列b是唯一索引,并且使列a为主键:
alert table t2 add index(d),add unique index(b),add primary key(a);
alert table t2 drop index d,drop index b,drop primary key;
添加/删除索引
create index idx_t2 on t2(d);
drop index inx_t2 on t2;
create unique index idx2_t2 on t2(b);
drop index idx2_t2 on t2;
三层模式
二层模式C/S(B/S)
三层模式C/A/S(B/A/S) 客湖层、逻辑层,数据层
灵活性和可扩展性,安全性,软件重用性
Mysql存储过程
use test;
delimiter //
create procedure simpleproc (out param1 int)
begin
select count(*) into parma1 from t;
end
//
delimiter ;
call simpleproc(@a);
Mysql用户使用命令
mysql的use的用法
show databases;
use mysql; 使用mysql表
use db1;
select count(*) from members;
select * from mysql.members;更详细
use db1;
select * from test.emp; //察看其他数据库的表,用"."
Mysql desc句法 表的结构
desc 表名[列名]
describe 提供有关一个表的列信息.列名可以是一个列名或是一个包含sql通配符字符"%"和"_"的字符串。没有必要用引号包围字符串。"%"表示任意的字符,
desc members 显示表的结构
desc members 'e%'; members以"e"开头的列
Mysql事物与所定
start/commit/rollback
commit(提交)就是将sql语句交给数据库系统执行并生效,数据更改于磁盘文件.
缺省的,mysql运行在autocommit模式,执行完就更新存储磁盘
如果使用事务安全表,通过下面的命令,可以设置mysql为非autocommit模式
set autocommit=0;
在此之后,你必须使用commit来存储你的更改到磁盘上,或使用rollback(回滚),
set autocommit=0;
可以用 select @@autocommit;来显示
rollback可以反悔
事务是一个不可分割的数据操作单元,事物中的操作要么都发生,要么都不发生。
事务可以用start transaction定义;
start transaction;
select @x=sum(发的工资) from emp where deptono=10;
update set a =@x;
commit;
自动体交语句
有些语句是无法回滚的,因为他们会自动提交,如:DDL语句(create/drop database,create/drop/alter table)
下面是自动的
alter table begin create index;
drop database drop database
load master data
例子
start transaction;
...
...
...
if @accoutn < 0 then
...
rollback; //他会回到start的时候;回滚到先前
end if
delete...
...
commit;
语法:
savepoint identifier
rellback to savepoint identifier
start transaction;
...
savepoint S001;
...
if @accoutn < 0 then
...
rollback S001; //他会回到指定的位置
end if
delete...
...
commit;
并发性
在单用户的数据库系统中,无需对数据的一致性和完整性做过多的考虑。而在多用户并发系统下就需要某种机制来实现数据的一致性和完整性
锁是解决问题的一种手段
lock tables 表名[read][write],表名[read][write].....
lock tables为当前线程锁定表.
使用lock tables;你必须拥有一个全局的lock tables权限和一个在相关表上的select权限
unlook talbes;
unlock talbes释放当前线程拥有的所有锁定.当线程发出另一个lock tables,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动的解锁;
write锁要比read所更优先处理
lock talbes trans read,customer wirte
Mysql全文检索
在数据库多张表进行复杂的模糊查询 匹配程度
全文检索在mysql中是一个fulltext类型索引.fulltext索引可以在create table时候之后使用alter talbe 或create index在char,varchar或text列上创建
对于大多数据库,将数据装载到一个没有fulltext索引的表中,然后再使用alter table(或create index)创建索引,这将是非常快的.将数据装载到一个已经有fulltext索引的表中,将是非常慢的
建表时候建索引
crate table articles(
id int unsigned auto_increment not null primary key,
title varchar(200),
body text,
fulltext(title,body)
);
然后添加数据
模糊搜索:查询标题和内容包含"database"的文章
select * from articles where match(title,body) against 'database'
# match(匹配)....againset(什么东西);
函数match()对照一个文本集(包含在一个fulltext索引中的一个或多个列的列表)执行一个自然语言搜索一个字符传.搜索字符串作为 against()的参数被给定.搜索以忽略字母大小写的方式执行.对于表中的每个记录行,match()返回一个相关性值.即搜索字符串与记录在 match()列表指定的列的文本之间的相似性尺度
Mysql查询缓存
Mysql查询缓存如何运作
Query Cache.存放一个select查询
Mysql查询缓存选项
Mysql查询缓存设置
Mysql查询缓存状态维护
Msyql的数据库管理
service mysql start
locate safe_msyqld linux命令找一个脚本
测试
mysqladmin ping 探测Mysql是否在运行
mysqladmin version
mysqlshow显示系统数据库和测试数据库test
出始的时候Mysql有四个默认用户
两个匿名用户,root,
删除匿名用户
添加一个test_user用户密码为123,可以在任何主机上登陆,有所有权限
grant select,insert,update,delete on *.* to 'test_user'@'%' identified '123';
添加一个用户test_user2,只可以在本机中登陆
grant select,insert,update,delete on test * to 'test_user2'@'localhost' indntified '123';
Thailand
创建一个本地的完全的超级用户admin,口令'123';
删除用户
revoke all on *.* from 'test_user'@localhost;
如果给root加密码
格式 mysqladmin -u用户名 -p旧密码 password新密码
也可以登陆后输入 set password=password("456");
还可以update user set password=password('456') where user='root';
flush privileges; //刷新内存表;
Mysql表的优化
optimize table 表1,表2.... 对含有varchar,blob,或text列的表(记录长度可变)的有用
Mysql表得导入
xx.txt导入mysql
load data infile '/tmp/xx.txt' into table 表名; 导入xx.txt;
mysqlimport school /tmp/xx.txt 另一种方法
Mysql表得导出
mysqldump --opt school > school_2006_9.sql //将数据库中所有的表备份到文件
mysqldump --opt school teacher student > school_2006_9.sql //将数据库中taacher和student表备份到文件
mysqldump --databases school test > schoool_test_2006.sql //备份多个数据库
进到数据库用source 以前的xx.sql备份
当用PHP5以下版本的PHP来连接MySQL5.0的数据库的时候,会出现下面的错误提示:
Client does not support authentication protocol requested by server; consider upgrading MySQL client
经过我在网上的一番查找终于找到问题的原因了,因为MySQL5.0的用户密码安全协议和以前的版本的不同了,为了让老版本的PHP连接数据库需要将MySQL的用户密码更换成老版本的。可以在mysql的命令行中执行下面的语句:
SET PASSWORD FOR 用户名@主机名 = OLD_PASSWORD('密码');
Mysql数据库同步
master/slave数据同步配置
A服务器设置
GRANT FILE ON *.* TO [email protected] IDENTIFIED BY ‘1234';
上面是Master开放一个账号backup密码1234给IP:192.168.1.3有档案处理的权限
备份Master所有数据库..通常都用tar命令
在A服务器上修改/etc/my.cnf
在[mysqld]区段内加入参数
log-bin
server-id=1
sql-bin-update-same
binlog-do-db=vbb
从起A服务器mysql
此时因为由加入log-bin参数,因此开始有index产生了,在/var/lib/mysql目录下有.index当案记录数据库的异动log.
B服务器设置
设定/etc/my.cnf
在[mysqld]区段加入
master-host=A主服务器IP地址
master-user=backup
master-password=1234
master-port=3306
server-id=2
master-connect-retry=60
replicate-do-db=vbb 告诉slave只做vbb数据库的更新
log-slave-updates
将A上的mysql.tar copy到B上
用ftp传B的/tmp
9
Mysql的新功能
索引分单列索引和组合索引
单列索引: 即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引,组合所印即一个索引包含多个列
普通话索引 三种方法创建
创建索引,例如 create index <索引的名字> ON tablename (列的列表);
修改表,例如 alter table tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引 CREATE TABLE table ([...],INDEX [索引的名字] (列的列表));
唯一性索引 唯一的区别:索引列的所有值都只能出现一次,即必须唯一.唯一性索引可以用以下几种创建
创建索引, CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表 ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
创建表的时候指定索引 CREATE TABLE tablename ([...],UNIQUE [索引的名字] [列的列表]);
主键
Mysql全文检索
MySQL全文检索简介
MySQL
模糊查询;匹配程度
Mysql3.23后支持全文检索
全文索引在mysql中是一个fulltext类型索引。fulltest索引可以在create table时或之后使用alter table或create index在char,varchar或text列上创建。
对于大的数据库,将数据装载到一个没有fulltext索引的表中,然后再使用alter table(或create index)创建索引,这将是非常快的。将数据装载到一个已经有fulltext索引的表中,将是非常慢的。
全文搜索通过match()函数完成。
create table articles( #创建一个带索引的表
id int unsigned auto_increment not null primary key,
title varchar(200),
body text,
fulltext(title,body) #需要在title,body进行全文索引
);
insert into articles (title,body) values #加入数据
('mysl tudsf','ater you wnt throut a ...'),
('msql tuadsf','fter you went dhrght a ...'),
('mysql tuadsf','afer you wet throuasdht a ...'),
('ysql tuadsf','fter you ent thrsadught a ...'),
('mysql tuadsf','aftr you ent throught a ...'),
('mysql tuadsf','after you went throught a ...'),
('mysql tuadsf','afte you ent throught a ...'),
('mysl tuf','aferr weu nt throught a ...'),
('mysql tuadsdsf','after you went tasdfrought a ...'),
('msql tuadsf','sdfeer you went throught a ...'),
('myql tuadsf','aferer you went throught a ...'),
('myql tuadsf','afsdfter you went throught a ...'),
('myasdfql tudsfdsf','aftersdfou went throught a ...'),
模糊搜索
select * from articles where match(title,body) against('mysql');
函数match()对照一个文本集(包含在一个fulltext索引中的一个或多个列的列集)执行自然语言搜索一个字符串。搜索字符串做为against ()的参数被给定。搜索以忽略字母大小写的方式执行。对于表中每个记录行,match()返回一个相关性值。即,在搜索字符串与记录行在match()列 表中指定的列的文本之间的相似性尺度。
当match()被使用在一个where子句中,返回的记录行被自动地以相关性从高度的次序排序。相关性值是非负的浮点数字
。零相关性意味着不相似。相关性的计算是基于:词在记录行的数目,在行中唯一的数目、在集中词的全部树木和包含一个特殊词的文档(记录行)的数目。
前面的例子是函数match()使用的一写基本说明。记录行以相似性递减的顺序返回。
administrator
select
Linux网络备份MYSQL(精彩)
感谢原创作者:曹江华
转自:http://soft.yesky.com/os/lin/461/2164461.shtml
笔者是一个中小Linux网站的管理员,系统构架是:RHEL 4.0 + PHP 4.3 + Mysql 4.03 +Apache 1.23。日均IP访问量在200次,一个典型的Linux小型网站。由于是小型网站,所以没有经费使用磁带机进行系统备份,使用的DVD光盘刻录机+网 络硬盘。随着Linux的应用日益广泛,特别是在网络应用方面,有大量的网络服务器使用Linux操作系统。由于Linux的桌面应用和Windows相 比还有一定的差距,所以在企业应用中往往是Linux和Windows操作系统共存形成异构网络。在服务器端大多使用Linux和Unix的,PC端使用 Windows 9X/2000/XP。
一、 本地备份
使用 mysqldump进行备份非常简单,如果要备份数据库” phpbb_db_backup ”,使用命令:
#mysqldump –u -p phpbb_db_backup > /usr/backups/mysql/ phpbb_db_backup.2005.5.6
还可以使用gzip命令对备份文件进行压缩:
#mysqldump phpbb_db_backup | gzip > /usr/backups/mysql/ phpbb_db_backup.2005.5.6。gz
恢复数据使用命令:
#mysql –u -p phpbb_db_backup </usr/backups/mysql/phpbb_db_backup.2005-5-6
二、 备份数据到DVD盘片
随着MYSQL数据量的增大,使用传统CD—R来备份硬盘并不现实,采用CD—RW分卷制作实在太麻烦、磁带机对于中小企业又过于昂贵。另外各个应用程序 的复杂度日与剧增, 处理的数据量也都相当庞大,Linux用户常常遇到的问题就是 : 有什么办法可以经济快捷的对数据做备份与保存。随着DVD刻录机和盘片的价格迅速降低,使用DVD刻录机用来备份Linux操作系统非常明智的。
1、安装
下面以IDE接口的内置刻录设备为例,介绍在Linux环境中使用DVD刻录机。Linux 需要将IDE接口的刻录设备虚拟为SCSI设备才能进行DVD刻录。2.4以上内核Linux发行版本包含了已编译进内核的 SCSI 仿真,所以只要对启动文件作一些小改动;USB或1394(FireWire)接口的外置刻录机就简单多了。
把DVD刻录机设备接入计算机第二个IDE接口(dev/hdc),开启电源。假设系统用Grub启动,用文本编辑器打开 /boot/grub/grub.conf,找到以“kernel”开头的一行,在这行内容的未尾加入“hdc=ide-scsi”,例如: “kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ hdc=ide-scsi”。
2、安装刻录软件
DVD+RW-Tools :一个包含有用于刻录DVD和映像的软件工具包,包括:Growisofs和dvd+rw-format。官方站点:http://fy.chalmers.se/~appro/linux/DVD+RW/ ,
CDRDAO :DAO即是Disk-At-Once(实时刻录),是一种在烧录过程中没有音轨间的两秒缓冲的刻录方法。它可以对磁盘的布局和磁道进行完全的控制,这一功能在刻录多来源的盘片相当有帮助。
cdrtools:包含了一套用于CD、DVD刻录的工具。Growisofs在创建映像时会使用这个软件包中的mkisofs工具,并且用户可以使用 readcd来从一个现有的DVD上创建ISO映像。此外,Cdrecord应用程序可被用于扫描连接系统上的CD/DVD刻录机,并且可以使用它来将 ISO映像刻录到CD—R(W)光盘上。通常大多数Linux版本包括这个软件,也可以下载使用:http: //freshmeat.net/redir/cdrecord/35795/url_homepage/cdrecord.html
dvdrecord:命令行下的DVD刻录软件。命令行下的DVD刻录可用于很多种情形,比如当我们通过远程访问主机时,机器上的图形界面无法启动时,或者机器由于某些原因无法启动GUI时。此外,在完成一些备份等自动重复的功能时,也需要使用命令行工具。
以上介绍了一下必须的软件和相关下载网址,安装过程比较简单,这里就不赘述了。
3、命令行下刻录
使用DVD+RW-Tools 进行刻录工作
growisofs是DVD+RW-Tools一个工具,Growlsofs访问其刻录设备使用的是一种不同的方式。它使用/dev下面的Unix路径来 连接刻录机。不同的系统和发行版中用于刻录机的路径不尽相同,所以最好的方法是查看发行版中的帮助。在一些系统中,一个名为/dev/dvd的软链接会被 设置成指向可用的DVD刻录机,在本文中,使用/dev/dvd来指定刻录机,如果系统中路径设置不同,那么请使用合适的路径将其取代。
(1)格式化可读写DVD光盘
可以使用DVD+RW-Tools工具包中提供的dvd十rw—format命令。它有两种格式化DVD光盘的方式:快速模式、完全模式。快速模式:
#dvd+rw-format -blank /dev/dvd
完全模式:
#dvd+rw-format -blank=full /dev/dvd
(2)将文件存储至DVD刻录盘:
DVD和普通的光盘一样,使用的也是ISO9660文件系统,以及同样的通用扩展(Joliet和RockRidge)。Growlsofs提供了一种简 单的将文件或目录存储至DVD刻录盘的方法。先用调用mkisofs工具来创建一个映像,并且无需在将该映像存储至硬盘之前就刻录下来。其基本的命令格式 如下:
#growisofs -dvd-compat -Z /dev/dvd -J -R /path/to/home/cao
此命令将/path/to/home/cao目录下的文件制作一个映像并且刻录到的DVD光盘。
二、网络备份
将MYSQL数据放在一台计算机上是不安全的,所以应当把数据备份到局域网中其他计算机中。假设Mysql服务器IP地址是:192.168.1.3。局 域网使用Linux的远程计算机IP地址是192.168.1.17;局域网使用Windows的远程计算机IP地址是192.168.1.18。网络拓 扑见图1.
1. 通过NFS网络备份
类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),在linux客户端挂接(mount)NFS磁盘共享之前,必须先配置好NFS服务端。linux系统NFS服务端配置方法如下:
(1)修改 /etc/exports,增加共享目录
/export/home/sunky 192.168.1.17(rw)
/export/home/sunky1 *(rw)
/export/home/sunky2 linux-client(rw)
注:/export/home/目录下的sunky、sunky1、sunky2是准备共享的目录,10.140.133.23、*、linux- client是被允许挂接此共享linux客户机的IP地址或主机名。如果要使用主机名linux-client必须在服务端主机/etc/hosts文 件里增加linux-client主机ip定义。格式如下:
192.168.1.17 linux-client
若修改/etc/export文件增加新的共享,应先停止NFS服务,再启动NFS服务方能使新增加的共享起作用。使用命令exportfs -rv也可以达到同样的效果。linux客户端挂接(mount)其他linux系统或UNIX系统的NFS共享。这里我们假设192.168.1.17 是NFS服务端的主机IP地址,当然这里也可以使用主机名,但必须在本机/etc/hosts文件里增加服务端ip定义。 /export/home/sunky为服务端共享的目录。如此就可以在linux客户端通过/mnt/nfs来访问其它linux系统或UNIX系统以 NFS方式共享出来的文件了。
把MYSQL数据备份到使用Linux的远程计算机需要在两端都安装NFS协议(Network File System),远程NFS计算机安装NFS协议后还要修改配置文件:/etc/exports,加入一行:
/usr/backups/mysql/ 192.168.1.17 (rw, no_root_squash)
表示将/usr/backups/mysql/目录共享。这个目录具有远程root用户读写权限。保存NFS配置文件,然后使用命令:
#exportfs -a –r
然后重新启动NFS服务:
#service nfsd start
远程计算机设定后,在MYSQL服务器/mnt 目录下建立一个backup_share目录:
#mkdir /mnt/backup_share
将远程的Linux计算机的/usr/backups/mysql/目录挂载到MYSQL服务器的/mnt/backup_share目录下:
# mount -t nfs 192.168.1.17:/usr/backups/mysql /mnt/backup_share
将目录挂载进来后,只要进入/mnt/backup_share 目录,就等于到了IP地址:192.168.1.7那部NFS 计算机的/usr/backups/mysql 目录中。下面使用mysqldump把“phpbb_db_backup”备份到远程计算机:
# mysqldump phpbb_db_backup > /mnt/backup_share/ phpbb_db_backup.2005-5-6
2. 通过Samba网络备份
Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba软件包。现 在流行的linux发行版绝大多数已经包含了samba软件包,如果安装linux系统时未安装samba请首先安装samba。当然也可以到 www.samba.org网站下载samba软件包,现在最新的版本是3.0.10版。然后Windows计算机上建立一个目录(/arc)并且共享, 赋予其读写权限。同样在MYSQL服务器/mnt 目录下建立一个backup_share1目录,然后进行挂载:
# mount -t smbfs -o username=cjh, password=XXXX //192.168.1.18/arc /mnt/backup_share
最后使用命令进行备份:
# mysqldump phpbb_db_backup > /mnt/backup_share/ phpbb_db_backup.2005-5-6
Mysql新特性
mysql> CREATE PROCEDURE p ()
-> BEGIN
-> /* This procedure does nothing */ <--
-> END;//Query OK, 0 rows affected (0.00 sec)
CREATE PROCDURE procedure (In paramter1 INTEGET) /定义存储过程名字和参数
BEGIN /* start of block */
DECLARE variable1 CHAR(10); /* variables变量声明 */
IF parameter1 =17 THEN /* start of IF IF条件开始 */
SET variable1 = 'birds';
ELSE
SET variable1 = 'beasts'; /* assignment赋值 */
END IF; /* end of IF IF 结束 */
INSERT INTO table1 VALUES (variable1); /* statement SQL语句 */
END /* end of block语句块结束 */
为什么要用存储过程
安装Mysql
tar xxfv mysql-xx
cd mysql-xx
make
make isntall
./script/mysql_install_db
启动和停止
mysqladmin version
mysqlshow
service mysql start
/etc/rc.d/init.d/mysqld start
mysqld_safe&
Mysql启动测试
locate safe_mysqld locate在linux下找一个脚本
mysqladmin ping 检测是否在工作
mysqladmin version Mysql版本号
mysqlshow 查看有多少数据库
刚安装完后有两个数据库
Mysql用户管理
增加一个用户test_user密码为123,
grant select,insert,update,delete on *.* to 'test_user'@'localhost' identikfied by '123';
use mysql
grant select,insert,update,delete on *.* to 'romote'@'%' identikfied by 'remote'
grant(vt同意,)语句创建Mysql用户并指定其权限,而revoke(vt,撤回,废除,宣告无效)语句删除权限,grant和revoke影响两个表
user,db数据库权限,tables_priv表的权限,columns_priv列级权限
use mysql;
delete from User where User=""; //删除没有必要的用户
update User set Password=PASSWORD('newpassword') where User='root' //更改用户的密码
update User set Password=PASSWORD('king') where User='remote'
如果要更改登陆终端,更新User表中相应用户的Host字段
平时不要用root用户管理mysql,Mysql的用户管理是通过User表来实现的,添加新用户常用有两个,一是在User表插入相应的数据行,同时设置权限;二是通过grant命令创建具有某种权限的用户.
grant的语法:
privileges(n特权,特别待遇,基本公民权利);
identified(vt识别,鉴别,把..和..看成一样v确定)
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
(管理权限)
grant all on sailboy.* to NewUserName@HostName identified by "password";
grant all on *.* to postfix@localhost identified by "postfix";
grant usage on *.* to NewUserName@HostName identified by "password"; 只允许登录--其它什么也不允许做。
grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
grant update,delete on mydb.TestTable to NewUserName
grant all on *.* to remote@localhost identified by "king";
REVOKE ALL on sailboy.* FROM reomote@'%';
REVOKE grant option on dbaaa.* FROM aaa@localhost;
若要给次用户赋予他相应对象上的权限的管理能力,可以grant后面添加with grant option选项
要是添加用户密码要使用函数PASSWORD
回收权限可以更改User,或REVOKE
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
连接的mysql mysql -h主机 -u用户名 -p密码
show tables; 查看有多少表
show databases; /*可以加入注释*/ 要以分号结束
# 单行注释
use mysql;
show talbes;
describe/desc 表名; 显示数据表的结构
desc user; 查看用户的详细信息
desc user;用户表结构
exit 退出Mysql
MySQL DCL入门 数据控制语言
每一张表有三个文件
create database school;
drop database school;
写的更严禁
drop database if exists school; # 如果
建表
use school;
create table teacher #建立教师情况表Teacher
(
Id int(5) auto increment not null primary key,
name char(10) not null,
address varchar(50) default '武汉大学',
year date
)
删除表
drop table teacher;
select * from jokes;
select id,jokedate form jokes;
select id,left(joketext,20),jokedate from jokes; 看joketext的前20字符
select count(*) from jokes;统计有多少条记录
PhpMyAdmin的使用
Mysql字符串和数字
ANSI字符串因该为''引号,""在mysql兼容
\n表示换行符
select 岩石引号和转意
select (100+98+99)/3; 当计算器
select 'hello','"hello"',""hello"",'hel"lo','\'hello';
数字
有效的浮点的例子
-32023.6809e+10
select hex('cat');
数字类型
准确类型 integer(int),smallint,tinyint和bigint 近似数字类型
商品价格 888.88 price decimal(5,2) 表示总长度:5,小数位:2
Mysql函数
比较运算符 = != <>,>,>=,<,<=
null安全等于比较 <=>
is null,is not null,isnull(expr) 是不是空
expr between min and max 如果expr大于或等于min,并且expr小于或等于 max,between返回1,否则返回0,它等价与表达式(min <=expr and expr <=max)
expr in(v1,v2,......) 如果expr是in列表中的一值,它将返回1,否则返回0。
在sql中,所有的逻辑预算符返回的值均为true,false或null(未知)。在mysql中,它们由1(true),0(false)和null实现。
not或! 逻辑非。如果操作数为0,返回1;如果操作数为非零,返回0
select not 10; //10为非零为真,反过来0 非零为真,0为假
select ! (1+1); //1+1=2 2不是零为真,反过来为假,显示为0
select ! 1+1; select (!1)+1
and或&& 逻辑与。如果所有的操作数都是非零或非null的,返回1;如果有一个或多个操作数为0,则返回0;只要操作数中有null返回值就是null
or或|| 逻辑或 如果任何一个操作数是非零的,返回值为1,如果任一操作数为null,返回值为null,否则返回0.
xor 逻辑异或, 如果人一操作数为null,返回值为null.对于非null的操作数,如果有奇书数个非零的操作数,结果返回为1,否则返回0。
1(true)0(false)或NULL.
null安全等于比较<=>
is null,is not null,isnull(expr)
expr between num and max
如果expr大于或等于min,并且expr小于或等于max,between返回1,否则返回0。它等价于表达式(min<=expr and expr<=max)
expr in(v1,v2,...)
如果expr是in列表中的一值,它返回1,否则返回0
ifnull(expr1,value) 如果expr1为非null的,ifnull()返回value,否则返回expr1.ifnull ()返回一个数字或字符串值,这取决它所使用的情况,用在统计时候
select ifnull(1,0); 1
select ifnull(null,0); 10
select ifnull(1/0,10); 10
select ifnull(1/0,'yes'); 'yes'
case value when [compare-value] then result [when[compare-value]] then result...][slse result] end
case when[condition] then result [when[condition] then result ...][else result] end
if(expr1,expr2,expr3) 如果expr1为真(expr1<>0以及expr1<>null),那么if()返回 expr2,否则返回expr3.if()返回一个数字或字符串,这取决于 它被使用的语境;
select if(1>2,2,3); 3
select if(1<2,'yes','no'); 'yes'
nullif(expr1,expr2) 比较两个表达式 如果expr1=expr2为真,返回null,否则返回expr1.
它等同于case when expr1 = expr2 then ull else expr1 end;
select nullif(1,1); null
select nullif(1,2); 1
优先级
:=
||,or,xor
&&,and
between,case,when,then,else
= <=>,<=,like,regexp,in,<,>,<=
|
&
<<,>>
-,+
,/div,%,mod,
^
not,!
Mysql字符串函数;
select ASCII('2');
select ASCII(2);
select bin(12); //二进制转换
ort(12); 八
hex(12) 十六
char() 以整数类型即使参数,返回这个整数所代表的ascii码值给出的字符组成的字符串, null值将被忽略.
select char(77,121,83,81,'76'); //翻译成ACCEII码 MySQL
length(str) 返回字符串str的的字节数。 char_length(str)
select length('test'); 4
concat(str1,str2...) 将参数连成字符串返回。如果有任何一个参数为null,返回值为null.可以有超过2个的参数。数字参 数将被转换为相等价的字符串形式。 里面有一个是空,返回为空
select concat('my','s','ql'); mysql
locate(子串substr,母串str) 返回子串substr在字符串str中第一次出现的位置,如果找不到,返回为0
select locate('bar','foobarbar'); 4 第一次出现的位置
select locate('xbar','foobar'); 0
instr(str,substr) 返回子串str中第一次出现的位置,和locate()相似,参数颠倒
select instr('foobarbar','bar'); 4
lpad(str,len,padstr) 用字符串padstr对str进行左边填补直至它的长度到达len个字符长度,然后返回str.如果str的长度长于len,那么它将被截除len个字符
select lpad('hi',4,'??'); // '??hi'
rpad(str,len,padstr) 用字符串padstr对str进行右边填补直至它的长度到达len个字符长度,然后返回str.如果str的长度长于len,那么它将被截除 len个字符
select rpad('hi',5,'?'); // 'hi???'
left(str,len) 返回字符串 str中最左边的len个字符
select right
SELECT语法
数据选择 select 列1,列2,...from 表1,表2,...
select joketext form jokes where joketext like "%鞋%"; %表示任意字符串
select joketext form jokes where joketext like "_鞋_"; _表示任意一个字符串
分组函数
员工表 emp(empno,name,tel,deptno,sal)
部门表 dept(depton,dame,addr)
显示每个部门的最高工资
select depton.max(sal) for emp group bydeptno;
Mysql数据定义语言DDL
创建数据库格式: 建库
create database [if not exists] 数据库名
create database if not exists test;
create database question;
删除数据库个是:drop database [if exists] 数据库名
Mysql的表 一个表实际上对应三个文件 xx.MYD xx.MYI xx.frm
create table 表名(
列1 类型[选项],
列2 类型[选项],
....
)
数据库数据目录 lib/mysql/ *.frm 表格式定义文件,*.myd数据文件,*.myi索引文件
create database school;
create talbe test(
a int,
b int
)
例子:
Mysql数据库的数据存放的主体是表(table)
建表:
create database school;
use school;
create table teacher #建立教师情况表
(
Id int(5) auto_increment not null primary key;
name char(10) not null,
address varchar(50) default '武汉大学',
year date
);
auto_increment每个记录自动加一,primary key主字段
drop table teacher; 删除表
修改表结构:
alert table 表1 rename 表2; //更改表名称
alert talbe t2 modify a tinyint not null,change b c char(20);
//为了改变列a,从integer改为tinyint not null(名字一样),并且改变列b,从char(10)改为char(20),同时重命名,从b改为c;
alert table t2 add d timestamp; //新增一个新timestamp列,名为d;
alert table t2 add c int auto_increment,add index(c);
//增加一个新的auto_inerement整数列,命名为e;我们用索引了c,因为auto_increment列必须被索引
alert table t2 drop columm c; //删除列c
desc table名字
Mysql视图
create table t(qty int,price int);人缘
insert into t values(3,50);
create view v as select qty,price,qty,price,qty*price as values from t;
select * from v;
Mysql索引
添加/删除匿名索引
在列d上增加一个索引,列b是唯一索引,并且使列a为主键:
alert table t2 add index(d),add unique index(b),add primary key(a);
alert table t2 drop index d,drop index b,drop primary key;
添加/删除索引
create index idx_t2 on t2(d);
drop index inx_t2 on t2;
create unique index idx2_t2 on t2(b);
drop index idx2_t2 on t2;
三层模式
二层模式C/S(B/S)
三层模式C/A/S(B/A/S) 客湖层、逻辑层,数据层
灵活性和可扩展性,安全性,软件重用性
Mysql存储过程
use test;
delimiter //
create procedure simpleproc (out param1 int)
begin
select count(*) into parma1 from t;
end
//
delimiter ;
call simpleproc(@a);
Mysql用户使用命令
mysql的use的用法
show databases;
use mysql; 使用mysql表
use db1;
select count(*) from members;
select * from mysql.members;更详细
use db1;
select * from test.emp; //察看其他数据库的表,用"."
Mysql desc句法 表的结构
desc 表名[列名]
describe 提供有关一个表的列信息.列名可以是一个列名或是一个包含sql通配符字符"%"和"_"的字符串。没有必要用引号包围字符串。"%"表示任意的字符,
desc members 显示表的结构
desc members 'e%'; members以"e"开头的列
Mysql事物与所定
start/commit/rollback
commit(提交)就是将sql语句交给数据库系统执行并生效,数据更改于磁盘文件.
缺省的,mysql运行在autocommit模式,执行完就更新存储磁盘
如果使用事务安全表,通过下面的命令,可以设置mysql为非autocommit模式
set autocommit=0;
在此之后,你必须使用commit来存储你的更改到磁盘上,或使用rollback(回滚),
set autocommit=0;
可以用 select @@autocommit;来显示
rollback可以反悔
事务是一个不可分割的数据操作单元,事物中的操作要么都发生,要么都不发生。
事务可以用start transaction定义;
start transaction;
select @x=sum(发的工资) from emp where deptono=10;
update set a =@x;
commit;
自动体交语句
有些语句是无法回滚的,因为他们会自动提交,如:DDL语句(create/drop database,create/drop/alter table)
下面是自动的
alter table begin create index;
drop database drop database
load master data
例子
start transaction;
...
...
...
if @accoutn < 0 then
...
rollback; //他会回到start的时候;回滚到先前
end if
delete...
...
commit;
语法:
savepoint identifier
rellback to savepoint identifier
start transaction;
...
savepoint S001;
...
if @accoutn < 0 then
...
rollback S001; //他会回到指定的位置
end if
delete...
...
commit;
并发性
在单用户的数据库系统中,无需对数据的一致性和完整性做过多的考虑。而在多用户并发系统下就需要某种机制来实现数据的一致性和完整性
锁是解决问题的一种手段
lock tables 表名[read][write],表名[read][write].....
lock tables为当前线程锁定表.
使用lock tables;你必须拥有一个全局的lock tables权限和一个在相关表上的select权限
unlook talbes;
unlock talbes释放当前线程拥有的所有锁定.当线程发出另一个lock tables,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动的解锁;
write锁要比read所更优先处理
lock talbes trans read,customer wirte
Mysql全文检索
在数据库多张表进行复杂的模糊查询 匹配程度
全文检索在mysql中是一个fulltext类型索引.fulltext索引可以在create table时候之后使用alter talbe 或create index在char,varchar或text列上创建
对于大多数据库,将数据装载到一个没有fulltext索引的表中,然后再使用alter table(或create index)创建索引,这将是非常快的.将数据装载到一个已经有fulltext索引的表中,将是非常慢的
建表时候建索引
crate table articles(
id int unsigned auto_increment not null primary key,
title varchar(200),
body text,
fulltext(title,body)
);
然后添加数据
模糊搜索:查询标题和内容包含"database"的文章
select * from articles where match(title,body) against 'database'
# match(匹配)....againset(什么东西);
函数match()对照一个文本集(包含在一个fulltext索引中的一个或多个列的列表)执行一个自然语言搜索一个字符传.搜索字符串作为 against()的参数被给定.搜索以忽略字母大小写的方式执行.对于表中的每个记录行,match()返回一个相关性值.即搜索字符串与记录在 match()列表指定的列的文本之间的相似性尺度
Mysql查询缓存
Mysql查询缓存如何运作
Query Cache.存放一个select查询
Mysql查询缓存选项
Mysql查询缓存设置
Mysql查询缓存状态维护
Msyql的数据库管理
service mysql start
locate safe_msyqld linux命令找一个脚本
测试
mysqladmin ping 探测Mysql是否在运行
mysqladmin version
mysqlshow显示系统数据库和测试数据库test
出始的时候Mysql有四个默认用户
两个匿名用户,root,
删除匿名用户
添加一个test_user用户密码为123,可以在任何主机上登陆,有所有权限
grant select,insert,update,delete on *.* to 'test_user'@'%' identified '123';
添加一个用户test_user2,只可以在本机中登陆
grant select,insert,update,delete on test * to 'test_user2'@'localhost' indntified '123';
Thailand
创建一个本地的完全的超级用户admin,口令'123';
删除用户
revoke all on *.* from 'test_user'@localhost;
如果给root加密码
格式 mysqladmin -u用户名 -p旧密码 password新密码
也可以登陆后输入 set password=password("456");
还可以update user set password=password('456') where user='root';
flush privileges; //刷新内存表;
Mysql表的优化
optimize table 表1,表2.... 对含有varchar,blob,或text列的表(记录长度可变)的有用
Mysql表得导入
xx.txt导入mysql
load data infile '/tmp/xx.txt' into table 表名; 导入xx.txt;
mysqlimport school /tmp/xx.txt 另一种方法
Mysql表得导出
mysqldump --opt school > school_2006_9.sql //将数据库中所有的表备份到文件
mysqldump --opt school teacher student > school_2006_9.sql //将数据库中taacher和student表备份到文件
mysqldump --databases school test > schoool_test_2006.sql //备份多个数据库
进到数据库用source 以前的xx.sql备份
当用PHP5以下版本的PHP来连接MySQL5.0的数据库的时候,会出现下面的错误提示:
Client does not support authentication protocol requested by server; consider upgrading MySQL client
经过我在网上的一番查找终于找到问题的原因了,因为MySQL5.0的用户密码安全协议和以前的版本的不同了,为了让老版本的PHP连接数据库需要将MySQL的用户密码更换成老版本的。可以在mysql的命令行中执行下面的语句:
SET PASSWORD FOR 用户名@主机名 = OLD_PASSWORD('密码');
Mysql数据库同步
master/slave数据同步配置
A服务器设置
GRANT FILE ON *.* TO [email protected] IDENTIFIED BY ‘1234';
上面是Master开放一个账号backup密码1234给IP:192.168.1.3有档案处理的权限
备份Master所有数据库..通常都用tar命令
在A服务器上修改/etc/my.cnf
在[mysqld]区段内加入参数
log-bin
server-id=1
sql-bin-update-same
binlog-do-db=vbb
从起A服务器mysql
此时因为由加入log-bin参数,因此开始有index产生了,在/var/lib/mysql目录下有.index当案记录数据库的异动log.
B服务器设置
设定/etc/my.cnf
在[mysqld]区段加入
master-host=A主服务器IP地址
master-user=backup
master-password=1234
master-port=3306
server-id=2
master-connect-retry=60
replicate-do-db=vbb 告诉slave只做vbb数据库的更新
log-slave-updates
将A上的mysql.tar copy到B上
用ftp传B的/tmp
9
Mysql的新功能
索引分单列索引和组合索引
单列索引: 即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引,组合所印即一个索引包含多个列
普通话索引 三种方法创建
创建索引,例如 create index <索引的名字> ON tablename (列的列表);
修改表,例如 alter table tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引 CREATE TABLE table ([...],INDEX [索引的名字] (列的列表));
唯一性索引 唯一的区别:索引列的所有值都只能出现一次,即必须唯一.唯一性索引可以用以下几种创建
创建索引, CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表 ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
创建表的时候指定索引 CREATE TABLE tablename ([...],UNIQUE [索引的名字] [列的列表]);
主键
Mysql全文检索
MySQL全文检索简介
MySQL
模糊查询;匹配程度
Mysql3.23后支持全文检索
全文索引在mysql中是一个fulltext类型索引。fulltest索引可以在create table时或之后使用alter table或create index在char,varchar或text列上创建。
对于大的数据库,将数据装载到一个没有fulltext索引的表中,然后再使用alter table(或create index)创建索引,这将是非常快的。将数据装载到一个已经有fulltext索引的表中,将是非常慢的。
全文搜索通过match()函数完成。
create table articles( #创建一个带索引的表
id int unsigned auto_increment not null primary key,
title varchar(200),
body text,
fulltext(title,body) #需要在title,body进行全文索引
);
insert into articles (title,body) values #加入数据
('mysl tudsf','ater you wnt throut a ...'),
('msql tuadsf','fter you went dhrght a ...'),
('mysql tuadsf','afer you wet throuasdht a ...'),
('ysql tuadsf','fter you ent thrsadught a ...'),
('mysql tuadsf','aftr you ent throught a ...'),
('mysql tuadsf','after you went throught a ...'),
('mysql tuadsf','afte you ent throught a ...'),
('mysl tuf','aferr weu nt throught a ...'),
('mysql tuadsdsf','after you went tasdfrought a ...'),
('msql tuadsf','sdfeer you went throught a ...'),
('myql tuadsf','aferer you went throught a ...'),
('myql tuadsf','afsdfter you went throught a ...'),
('myasdfql tudsfdsf','aftersdfou went throught a ...'),
模糊搜索
select * from articles where match(title,body) against('mysql');
函数match()对照一个文本集(包含在一个fulltext索引中的一个或多个列的列集)执行自然语言搜索一个字符串。搜索字符串做为against ()的参数被给定。搜索以忽略字母大小写的方式执行。对于表中每个记录行,match()返回一个相关性值。即,在搜索字符串与记录行在match()列 表中指定的列的文本之间的相似性尺度。
当match()被使用在一个where子句中,返回的记录行被自动地以相关性从高度的次序排序。相关性值是非负的浮点数字
。零相关性意味着不相似。相关性的计算是基于:词在记录行的数目,在行中唯一的数目、在集中词的全部树木和包含一个特殊词的文档(记录行)的数目。
前面的例子是函数match()使用的一写基本说明。记录行以相似性递减的顺序返回。
administrator
select
Linux网络备份MYSQL(精彩)
感谢原创作者:曹江华
转自:http://soft.yesky.com/os/lin/461/2164461.shtml
笔者是一个中小Linux网站的管理员,系统构架是:RHEL 4.0 + PHP 4.3 + Mysql 4.03 +Apache 1.23。日均IP访问量在200次,一个典型的Linux小型网站。由于是小型网站,所以没有经费使用磁带机进行系统备份,使用的DVD光盘刻录机+网 络硬盘。随着Linux的应用日益广泛,特别是在网络应用方面,有大量的网络服务器使用Linux操作系统。由于Linux的桌面应用和Windows相 比还有一定的差距,所以在企业应用中往往是Linux和Windows操作系统共存形成异构网络。在服务器端大多使用Linux和Unix的,PC端使用 Windows 9X/2000/XP。
一、 本地备份
使用 mysqldump进行备份非常简单,如果要备份数据库” phpbb_db_backup ”,使用命令:
#mysqldump –u -p phpbb_db_backup > /usr/backups/mysql/ phpbb_db_backup.2005.5.6
还可以使用gzip命令对备份文件进行压缩:
#mysqldump phpbb_db_backup | gzip > /usr/backups/mysql/ phpbb_db_backup.2005.5.6。gz
恢复数据使用命令:
#mysql –u -p phpbb_db_backup </usr/backups/mysql/phpbb_db_backup.2005-5-6
二、 备份数据到DVD盘片
随着MYSQL数据量的增大,使用传统CD—R来备份硬盘并不现实,采用CD—RW分卷制作实在太麻烦、磁带机对于中小企业又过于昂贵。另外各个应用程序 的复杂度日与剧增, 处理的数据量也都相当庞大,Linux用户常常遇到的问题就是 : 有什么办法可以经济快捷的对数据做备份与保存。随着DVD刻录机和盘片的价格迅速降低,使用DVD刻录机用来备份Linux操作系统非常明智的。
1、安装
下面以IDE接口的内置刻录设备为例,介绍在Linux环境中使用DVD刻录机。Linux 需要将IDE接口的刻录设备虚拟为SCSI设备才能进行DVD刻录。2.4以上内核Linux发行版本包含了已编译进内核的 SCSI 仿真,所以只要对启动文件作一些小改动;USB或1394(FireWire)接口的外置刻录机就简单多了。
把DVD刻录机设备接入计算机第二个IDE接口(dev/hdc),开启电源。假设系统用Grub启动,用文本编辑器打开 /boot/grub/grub.conf,找到以“kernel”开头的一行,在这行内容的未尾加入“hdc=ide-scsi”,例如: “kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ hdc=ide-scsi”。
2、安装刻录软件
DVD+RW-Tools :一个包含有用于刻录DVD和映像的软件工具包,包括:Growisofs和dvd+rw-format。官方站点:http://fy.chalmers.se/~appro/linux/DVD+RW/ ,
CDRDAO :DAO即是Disk-At-Once(实时刻录),是一种在烧录过程中没有音轨间的两秒缓冲的刻录方法。它可以对磁盘的布局和磁道进行完全的控制,这一功能在刻录多来源的盘片相当有帮助。
cdrtools:包含了一套用于CD、DVD刻录的工具。Growisofs在创建映像时会使用这个软件包中的mkisofs工具,并且用户可以使用 readcd来从一个现有的DVD上创建ISO映像。此外,Cdrecord应用程序可被用于扫描连接系统上的CD/DVD刻录机,并且可以使用它来将 ISO映像刻录到CD—R(W)光盘上。通常大多数Linux版本包括这个软件,也可以下载使用:http: //freshmeat.net/redir/cdrecord/35795/url_homepage/cdrecord.html
dvdrecord:命令行下的DVD刻录软件。命令行下的DVD刻录可用于很多种情形,比如当我们通过远程访问主机时,机器上的图形界面无法启动时,或者机器由于某些原因无法启动GUI时。此外,在完成一些备份等自动重复的功能时,也需要使用命令行工具。
以上介绍了一下必须的软件和相关下载网址,安装过程比较简单,这里就不赘述了。
3、命令行下刻录
使用DVD+RW-Tools 进行刻录工作
growisofs是DVD+RW-Tools一个工具,Growlsofs访问其刻录设备使用的是一种不同的方式。它使用/dev下面的Unix路径来 连接刻录机。不同的系统和发行版中用于刻录机的路径不尽相同,所以最好的方法是查看发行版中的帮助。在一些系统中,一个名为/dev/dvd的软链接会被 设置成指向可用的DVD刻录机,在本文中,使用/dev/dvd来指定刻录机,如果系统中路径设置不同,那么请使用合适的路径将其取代。
(1)格式化可读写DVD光盘
可以使用DVD+RW-Tools工具包中提供的dvd十rw—format命令。它有两种格式化DVD光盘的方式:快速模式、完全模式。快速模式:
#dvd+rw-format -blank /dev/dvd
完全模式:
#dvd+rw-format -blank=full /dev/dvd
(2)将文件存储至DVD刻录盘:
DVD和普通的光盘一样,使用的也是ISO9660文件系统,以及同样的通用扩展(Joliet和RockRidge)。Growlsofs提供了一种简 单的将文件或目录存储至DVD刻录盘的方法。先用调用mkisofs工具来创建一个映像,并且无需在将该映像存储至硬盘之前就刻录下来。其基本的命令格式 如下:
#growisofs -dvd-compat -Z /dev/dvd -J -R /path/to/home/cao
此命令将/path/to/home/cao目录下的文件制作一个映像并且刻录到的DVD光盘。
二、网络备份
将MYSQL数据放在一台计算机上是不安全的,所以应当把数据备份到局域网中其他计算机中。假设Mysql服务器IP地址是:192.168.1.3。局 域网使用Linux的远程计算机IP地址是192.168.1.17;局域网使用Windows的远程计算机IP地址是192.168.1.18。网络拓 扑见图1.
1. 通过NFS网络备份
类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),在linux客户端挂接(mount)NFS磁盘共享之前,必须先配置好NFS服务端。linux系统NFS服务端配置方法如下:
(1)修改 /etc/exports,增加共享目录
/export/home/sunky 192.168.1.17(rw)
/export/home/sunky1 *(rw)
/export/home/sunky2 linux-client(rw)
注:/export/home/目录下的sunky、sunky1、sunky2是准备共享的目录,10.140.133.23、*、linux- client是被允许挂接此共享linux客户机的IP地址或主机名。如果要使用主机名linux-client必须在服务端主机/etc/hosts文 件里增加linux-client主机ip定义。格式如下:
192.168.1.17 linux-client
若修改/etc/export文件增加新的共享,应先停止NFS服务,再启动NFS服务方能使新增加的共享起作用。使用命令exportfs -rv也可以达到同样的效果。linux客户端挂接(mount)其他linux系统或UNIX系统的NFS共享。这里我们假设192.168.1.17 是NFS服务端的主机IP地址,当然这里也可以使用主机名,但必须在本机/etc/hosts文件里增加服务端ip定义。 /export/home/sunky为服务端共享的目录。如此就可以在linux客户端通过/mnt/nfs来访问其它linux系统或UNIX系统以 NFS方式共享出来的文件了。
把MYSQL数据备份到使用Linux的远程计算机需要在两端都安装NFS协议(Network File System),远程NFS计算机安装NFS协议后还要修改配置文件:/etc/exports,加入一行:
/usr/backups/mysql/ 192.168.1.17 (rw, no_root_squash)
表示将/usr/backups/mysql/目录共享。这个目录具有远程root用户读写权限。保存NFS配置文件,然后使用命令:
#exportfs -a –r
然后重新启动NFS服务:
#service nfsd start
远程计算机设定后,在MYSQL服务器/mnt 目录下建立一个backup_share目录:
#mkdir /mnt/backup_share
将远程的Linux计算机的/usr/backups/mysql/目录挂载到MYSQL服务器的/mnt/backup_share目录下:
# mount -t nfs 192.168.1.17:/usr/backups/mysql /mnt/backup_share
将目录挂载进来后,只要进入/mnt/backup_share 目录,就等于到了IP地址:192.168.1.7那部NFS 计算机的/usr/backups/mysql 目录中。下面使用mysqldump把“phpbb_db_backup”备份到远程计算机:
# mysqldump phpbb_db_backup > /mnt/backup_share/ phpbb_db_backup.2005-5-6
2. 通过Samba网络备份
Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba软件包。现 在流行的linux发行版绝大多数已经包含了samba软件包,如果安装linux系统时未安装samba请首先安装samba。当然也可以到 www.samba.org网站下载samba软件包,现在最新的版本是3.0.10版。然后Windows计算机上建立一个目录(/arc)并且共享, 赋予其读写权限。同样在MYSQL服务器/mnt 目录下建立一个backup_share1目录,然后进行挂载:
# mount -t smbfs -o username=cjh, password=XXXX //192.168.1.18/arc /mnt/backup_share
最后使用命令进行备份:
# mysqldump phpbb_db_backup > /mnt/backup_share/ phpbb_db_backup.2005-5-6
Mysql新特性
mysql> CREATE PROCEDURE p ()
-> BEGIN
-> /* This procedure does nothing */ <--
-> END;//Query OK, 0 rows affected (0.00 sec)
CREATE PROCDURE procedure (In paramter1 INTEGET) /定义存储过程名字和参数
BEGIN /* start of block */
DECLARE variable1 CHAR(10); /* variables变量声明 */
IF parameter1 =17 THEN /* start of IF IF条件开始 */
SET variable1 = 'birds';
ELSE
SET variable1 = 'beasts'; /* assignment赋值 */
END IF; /* end of IF IF 结束 */
INSERT INTO table1 VALUES (variable1); /* statement SQL语句 */
END /* end of block语句块结束 */
为什么要用存储过程
相关阅读 更多 +