1、从网上下载安装文件(这里我下载了一个MySQL二进制分发)
http://dev.mysql.com/downloads/index.html
2、通过secureCRT把文件传到主机
复制mysql-3.23.58-pc-linux-i686.tar到C:/Program Files/SecureCRT/upload中,在命令行中执行rz,即可传送文件到服务器端。
(下载执行sz filename,文件传送到download文件夹)
移动到/usr/local/下
mv mysql-3.23.58-pc-linux-i686.tar.gz /usr/local/
3、查看是否曾经安装过
rpm --query -a | grep 'my' (现在是没有装过,如果查到有,用rpm -e * 删除已经安装的包)
3、解压缩
gunzip < mysql-3.23.58-pc-linux-i686.tar.gz |tar xvf -
建立符号连接,方便操作
ln -s mysql-3.23.58-pc-linux-i686 mysql
cd mysql
“bin”
这个目录包含客户程序和服务器,你应该把这个目录的完整路径
加到你的PATH环境变量,以便你的shell能正确的找到MySQL程序。
“scripts”
这个目录包含mysql_install_db脚本,用来初始化服务器存取权限。
如果要安装到其他目录,编辑“bin/mysqlaccess”脚本,指定安装路径
$MYSQL = “/usr/local/bin/mysql”; # path to mysql executable
4、创造MySQL授权表(只有在你以前没安装过MySQL是必要的):
scripts/mysql_install_db
5、打算开启自动启动mysql
在/etc/rc.local中加入以下一行
/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld &'
6、试试用下列命令启动MySQL服务器
bin/safe_mysqld &
chown: `mysql': invalid user
Starting mysqld daemon with databases from /usr/local/mysql/data
060427 06:54:59 mysqld ended
晕,应该是用户权限的错误
查看用户
tail /etc/passwd
原来还没有建立mysql用户
useradd -M -o -r -d /var/lib/mysql -s /bin/bash -c "MySQL Server" -u 27 mysql
7、再次执行
Starting mysqld daemon with databases from /usr/local/mysql/data
bin/safe_mysqld: line 284: 2067 Segmentation fault $NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file=$pid_file --skip-locking >>$err_log 2>&1
060427 07:09:26 mysqld ended
感觉象是环境变量的问题,翻看另一个教程,步骤好像有点不一样,没有改变目录的拥有者,再试
[root@linux mysql]# chown -R root .
[root@linux mysql]# chown -R mysql data
[root@linux mysql]# chgrp -R mysql .
然后执行bin/safe_mysqld &
哈哈,终于启动了,
关闭数据库用support-files/mysql.server stop或mysqladmin shutdown
8、修改root的mysql密码
需要在数据库开启的时候才能执行
bin/mysqladmin -u root password 'redhat'
bin/mysqladmin -u root -h linux password 'redhat'
9、为了使用mysqladmin方便点,还是设置一下环境变量
编辑/etc/profile,让所有用户均有该设置,添加
# add mysql path
PATH=$PATH:/usr/local/mysql/bin
注销后重新登陆就可以生效环境变量了
10、安装后的测试
查看版本
mysqladmin -u root -p version
查看数据库
mysqlshow -u root -p
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
mysqlshow mysql -u root -p
mysql -e "select host,db,user from db" mysql -u root -p
11、使用用户名和密码登陆
mysql [-h host_name][-u user_name][-pyour_pass ]
例:mysql -u root -predhat
mysql> select 1+1;
mysql> exit
退出,试试其他用户
su lhj
mysql -u lhj
可以连接上,使用的是test库,没有权限操作mysql库
mysql -u root -p
同样可以用root用户登录进数据库
12、开始使用
mysql> select version(),current_date;
获得版本和日期
now() 当前时间 user()当前用户 /c取消命令
select * from tb_name order by price desc limit 1
limit 1指名只取结果第一行,相当于oracle的rownum <= 1
mysql> show databases;
查看有几个数据库
mysql> use test
切换到test库中,那样就可以不用再表名前输入数据库名了
mysql> SHOW TABLES
查看库中有什么表
13、创建用户
先建立用户所要用到的数据库
mysql> create database lhj;
建立一个可在任意主机登陆的lhj帐户,赋予lhj库的一般权限
mysql> grant select,insert,delete,drop,create,update on lhj.* to lhj@'%' identified by 'lhj123';
这时候尝试登陆失败,每次都认为是匿名用户,郁闷。查找出现这个情况的原因,文档说建议把user表中的host字段指定主机而不是用%(那为什么教程里那样说?)。
mysql> update user set host='localhost' where user='lhj';
mysql> flush privileges;
重新用lhj登陆,成功。
尝试用alter和create indxe命令失败,没有权限。
mysql> create table t_lhj(id int,name varchar(20),password varchar(20));
mysql> alter table t_lhj add(timestamp date);
mysql> create index idx_lhj on t_lhj(id);
用root登陆,给权限
mysql> grant index,alter on lhj.* to lhj;
呵呵,现在可以了。
查看表结构跟oracle一样
mysql> desc t_lhj;
14、一般的数据库开发所需知识点
mysql是一个相对简单的数据库系统,某些大型数据库支持的功能mysql都没有提供(至少3.23版本前都没有提供)。在这里有以下要注意的几个方面:
(1)在select语句中不支持in (select * from tab)和not in (select * from tab)的语法.但支持in (1,2,3)和not in (1,2,3)的语法.
(2)不支持事务处理.但可通过使用LOCK TABLES和UNLOCK TABLES命令阻止其他线程的干扰
(3)不支持存储过程和触发器,但新版本可能会支持存储过程.
(4)不支持外键,也不支持视图,但新版本可能支持视图.
mysql支持的列类型如下:
M 指出最大的显示尺寸。最大的合法的显示尺寸是 255 。
D 适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。
数字:可在类型后带[UNSIGNED]或[ZEROFILL].如果带ZEROFILL则自动声明为UNSIGNED,并且在空位自动补0,如TINYINT类型的1会变成001.另外,在超过类型支持范围的值,大于的取最大值,小于的取最小值.
TINYINT[(M)] 有符号的范围是-128到127,无符号的范围是0到255。
SMALLINT[(M)] 有符号的范围是-32768到32767,无符号的范围是0到65535。
MEDIUMINT[(M)] 有符号的范围是-8388608到8388607,无符号的范围是0到16777215。
INT[(M)] 有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。
INTEGER[(M)] 这是INT的一个同义词。
BIGINT[(M)] 有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。
注意,所有算术运算用有符号的BIGINT或DOUBLE值完成,所以如果运算数或结果超出范围,将得到不可测的结果.
FLOAT[(M,D)] 不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0和1.175494351E-38到 3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。
DOUBLE[(M,D)] 不能无符号。允许的值是-1.7976931348623157E+308到 -2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+ 308。M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。
DOUBLE PRECISION[(M,D)] 和 REAL[(M,D)] 是DOUBLE同义词。
DECIMAL[(M[,D])] 一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。小数 点,并且对于负数,“-”符号不在M中计算。如果D是0,值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的 DECIMAL列,实际的范围可以通过M和D的选择被限制。如果D被省略,它被设置为0。如果M被省掉,它被设置为10。
NUMERIC(M,D) 这是DECIMAL的一个同义词。
时间日期:
DATE 一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。可用current_date或now()赋值.
DATETIME 一个日期和时间组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。可用now()赋当前时间值.如果用 current_date,则时间部分全为0.
TIME 一个时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。
YEAR[(2|4)] 一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。
TIMESTAMP[(M)] 一个时间戳记。范围是'1970-01-01 00:00:00'到2037年的某时。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显 示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个 TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时 间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间。该行更新的时候也会自动更新这个字段.
字符类型:
CHAR(M) [BINARY] 一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~ 255个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。
[NATIONAL] VARCHAR(M) [BINARY] 一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是1 ~ 255个字符。 VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。
TINYBLOB 或 TINYTEXT 一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。
BLOB 或 TEXT 一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。
MEDIUMBLOB 或 MEDIUMTEXT 一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。
LONGBLOB 或 LONGTEXT 一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。
注:TEXT与BLOB的区别是检索时TEXT大小写不敏感,而BLOB敏感.可以说TEXT是大小写不敏感的BLOB.
ENUM('value1','value2',...) 枚举。一个仅有一个值的字符串对象,这个值式选自与值列表'value1'、'value2', ...,或NULL。一个ENUM最多能有65535不同的值。
SET('value1','value2',...) 一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出。一个SET最多能有64个成员。
15、高级应用之使用HEAP表
HEAP表是mysql数据库表的一种,使用一个杂凑(hashed)索引并且存储在内存中。这使他们更快,但是如果MySQL崩溃,你将失去所有存储的数据。HEAP作为临时表很可用!
CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
FROM log_table GROUP BY ip;
SELECT COUNT(ip),AVG(down) FROM test;
DROP TABLE test;
注意:
你应该总是在CREATE语句中指定MAX_ROWS以保证你有意不使用所有的内存。
索引将只能与与=和<=>一起使用(但是很快)。
HEAP表使用一个固定的记录长度格式。
HEAP不支持BLOB/TEXT列。
HEAP不支持AUTO_INCREMENT列。
HEAP不支持在一个NULL列上的索引。
你可以在一个HEAP表中有非唯一键(杂凑表一般不这样)。
HEAP表格在所有的客户之间被共享(就象任何其他的表)。
HEAP表的数据以小块分配。表是100%动态的(在插入时),无需溢出区和额外的键空间。删除的行放入一个链接表并且当你把新数据插入到表时,它将被再次使用。
为了释放内存,你应该执行DELETE FROM heap_table或DROP TABLE heap_table。
为了保证你不会偶然做些愚蠢的事情,你不能创建比max_heap_table_size大的HEAP表。
16、使用mysql的C API
开始进入正题,使用C来连接数据库,在做具体操作前应该先保证编译的成功,所以先用简单的程序来验证。
文件mysqlc.c
#i nclude "mysql.h"
#i nclude
int main()
{
MYSQL *my_connection;
int iRes;
my_connection=mysql_init(NULL);
return 1;
}
[root@linux testc]# gcc mysqlc.c -o mysqlc
mysqlc.c:1:19: mysql.h: No such file or directory
呵呵,头文件都找不到,加入头文件的路径
[root@linux testc]# gcc mysqlc.c -I /usr/local/mysql/include/ -o mysqlc
: undefined reference to `mysql_init'
没有找到函数定义,应该是库文件没有加上
[root@linux testc]# gcc mysqlc.c -I /usr/local/mysql/include/ -L /usr/local/mysql/lib/ -lmysqlclient -o mysqlc
: undefined reference to `compress'
晕,还是有错,看样子是没有解压缩的函数定义,看网上有些例子加上了-lz的参数,试一下
root@linux testc]# gcc mysqlc.c -I /usr/local/mysql/include/ -L /usr/local/mysql/lib -lmysqlclient -lz -o mysqlc
呵呵,这回编译成功了
到此基本的操作已经完成了,下面有一个用C对mysql进行操作的例子,见文件
附件1-mysqlc的基本操作.txt