Mysql编译安装

Mysql编译安装

Mysql修饰符

mysql innodb的学习(一)

 

 

 

编译安装

not null

mysql下最常用的两个存储引擎一个是Myisam,另一个是innodb,关于这两个引擎的区别和比较,网上有好多,这里就不再说明了,这里主要讲一下innodb的各个参数的作用和对性能的影响。其中对性能影响最明显的两个参数innodbbufferpoolsize和innodblogfilesize。

  www.2cto.com  

有not null 来修饰的话,往表里添加默认值的时候:

  www.2cto.com  

编译安装之前的准备工作:

数值类型的话,添加的是0

innodbbufferpool_size 这个参数可以说是对innodb的性能有着决定性的作用,缓冲区的大小决定了innodb性能的好坏。缓冲区不仅缓存innodb的索引,还存储了数据、自适应哈希索引(adaptive hash index)、插入缓存、锁、以及其他的一些内部结构。这个值的大小怎么设置呢,设置多大才合适呢,mysql的配置文件中给出的建议是设置为服务器内存的50%-80%,但是在32位的机器中,mysql的手册中有一个警告:  www.2cto.com  

添加mysql帐号

字符串类型的话,添加的是空

 

# useradd mysql

如果数据类型是时间戳类型,添加的默认值是当前时间

在32位GNU/Linux x86上,你必须要小心不要设置过高的内存用量。glibc可能允许进程堆积在线程堆栈上发展,它会造成你的服务器崩溃。如果下列表达式的值接近或者超过2GB,系统会面临危机:innodbbufferpool_size

目的:避免数据库初始化出现问题

枚举类型,添加的是第一个预先定义的值

  • keybuffersize(myisam使用的缓冲区) maxconnections*(sortbuffersize readbuffersize binlogcachesize) maxconnections*2MB

 

  www.2cto.com  

 

安装:

验证举例:

innodb使用这个缓冲区来延缓write,所以可以将多个write合并,然后顺序的写到disk中,这样可以将原来的随机写改进到顺序写,提高数据写的效率。 innodb对写操作的执行过程为先将写操作的改动写到buffer pool中,然后记录操作日志到log file(日志文件的配置参数为innodblogfile_size)中,然后就返回结果到客户端,这样就提高了innodb的响应速度(不需要等写到磁盘后再返回,在内存中的操作会比在磁盘上的操作快),而在buffer pool改动过的记录就是“脏数据(脏页)dirty page”。 那接下来问题就来了:

[[email protected] bin]# tar xvzf mysql-5.1.34.tar.gz -C /usr/local/src/

mysql> create table t6(a int not null,b char(10) not null,c timestamp not null,d enum('y','n') not null);

 

[[email protected] lamp]# cd /usr/local/src/

mysql> insert into t6 values();  // 添加默认值(就是values后面为空,什么都不写)

innodb是怎么把buffer pool中的“脏页”写到磁盘的呢?

[[email protected] src]# cd mysql-5.1.34/

mysql> select * from t6;

innodb的缓冲区中能保存多少dirty page呢?

[[email protected] mysql-5.1.34]# ./configure --with-mysqld-user=mysql --prefix=/usr/local/mysql --with-extra-charsets=all --exec-prefix=/usr/local/mysql --with-innodb

--- --- --------------------- ---

对于第一个问题,innodb使用一个后台的线程来刷新(flush)数据到磁盘(将多个写操作合并执行,可以将随机写改为顺序写来提高效率) 对于第二个问题,innodb中使用参数innodbmaxdirtypagespct来控制dirty page在buffer pool中的最大比例,当达到这个值时,innodb就会使用flush thread来将数据写到磁盘(如何写将在后续中讨论),当没有达到这个值时,innodb的flush线程会在buffer pool中没有足够的空间来写新数据时执行flush的操作,这个行为称为“懒执行(lazy)”,就是innodb可以延迟flush操作。 延迟执行不代表就不执行了,因为如果在服务器压力比较大的情况下(有大量的并发写),buffer pool中就会有很多的dirty page,那么就会很容易达到innodbmaxdirtypagespct,那么flush thread就会要尽量快将buffer pool中dirty page刷新到磁盘中,以降低脏页在缓冲区中的比例。

 // 运行mysql的时候用哪个身份执行  安装目录    默认支持所有字符集   安装目录会产生一个bin    表类型

| a | b | c                   | d |

 

[[email protected] mysql-5.1.34]#make && make install 

--- --- --------------------- ---

虽然buffer pool对innodb的性能有很大影响,但是也不是越大越好,越大的缓冲区对mysql服务的关闭和启动就要执行越长的时间。比如缓冲区中有很多的“脏页”,innodb要花相对长的时间来将脏页刷新到磁盘中,只有等所有的脏页都刷新后,mysql才会关闭。当然也可以使用快速关闭,但是启动的时候,mysql要花相对长的时间来恢复,所以对于关闭和启动这整个流程来说,大的缓冲区还是对这整个流程的时间来说要相对长。 我们可以在mysql运行过程中动态的调整innodbmaxdirtypagespct值,动态的设置相对小一些,可以是flush线程尽快的将脏页刷新到磁盘,后再执行关闭的操作,这样可以从某一方面来说缩短关闭的时间。我们可以通过SHOW INNODB STATUS命令来查看当前脏页的数据innodbbufferpoolpagesdirty。

  www.2cto.com  

| 0 |   | 2009-12-28 15:42:17 | y |     

 

初始化数据库:

--- --- --------------------- ---

如果我们有一个大的缓冲区和一个慢的磁盘,那么服务器重启时就会要花一个相对长的时间来预热,这个对于mysql的整体性能也会有一定的影响。

[[email protected] mysql-5.1.34]# cd /usr/local/mysql/

 

 

[[email protected] mysql]# ls


innodb的学习(一) mysql下最常用的两个存储引擎一个是Myisam,另一个是innodb,关于这两个引擎的区别和比较,网上有好多,这里就不再...

bin  docs  include  lib  libexec  mysql-test  share  sql-bench   // 目录里应该有一个默认的存放mysql数据的var目录,进行数据库的初始化才能产生

  www.2cto.com  

[[email protected] mysql]# cd bin

default

[[email protected] bin]# ./mysql_install_db 进行数据库的初始化

default修饰符为字段指定一个默认值

 

 

修改权限:

例子:

[[email protected] mysql]# chown .mysql -R .      // 递归修改当前目录(mysql安装目录)所有文件的所属组为mysql组

> create table t2(id int,name varchar(10),dep varchar(10) default "HR");

[[email protected] mysql]# ll -d .   // 查看当前目录的详细信息     -d 将目录象其它文件一样列出,而不是列出它们的 内容

> insert into t2 set id=1,name="Lili";

drwxr-xr-x 11 root mysql 4096 12-25 11:58 .

> insert into t2 set id=2,name="Anna";

[[email protected] mysql]# chown mysql var -R    // 递归修改var目录的所有者为mysql帐户

> insert into t2 set id=3,name="Hebe",dep="MIS";

 

> select * from t2;

启动:

------ ------ ------

[[email protected] mysql]# cd bin/

| id   | name | dep  |

[[email protected] bin]# ./mysqld_safe --user=mysql &   // 后台启动mysql

------ ------ ------

[[email protected] bin]# ps -e  

|    1 | Lili | HR   | 

22127 pts/1    00:00:00 mysqld_safe

|    2 | Anna | HR   | 

22178 pts/1    00:00:00 mysqld

|    3 | Hebe | MIS  | 

看到这两个进程就说明mysql已经启动成功了

------ ------ ------

启动之后也会产生一个套接字文件

 

[[email protected] bin]# cd /tmp/

auto_increment

[[email protected] tmp]# ls mysql.sock 

auto_increment修饰符只适用于INT字段,表明MySQL应该自动为该字段生成一个数(每次在前一个值得基础上加1)。

mysql.sock

MySQL的表只能有一个auto_increment 字段,而且这个字段必须被定义为键。

在/tmp下,如果有了这个文件,也说明mysql已经启动了,没有这个文件,mysql是不会启动的

 

 

> create table t3 (id int not null auto_increment primary key,name varchar(10) not null);


> insert into t3(name) values("Anna");

 

> insert into t3(name) values("Nana");

修改环境变量:

mysql> select * from t3;

修改家目录的环境变量,可以在任意目录下执行mysql bin目录下的命令

---- ------

[[email protected] ~]# vim .bash_profile 

| id | name |

 PATH=/usr/local/mysql/bin:$PATH:$HOME/bin

---- ------

使之生效:

|  1 | Anna | 

[[email protected] ~]# source .bash_profile

|  2 | Nana | 

测试: 

---- ------

[[email protected] ~]# which mysqladmin

 

/usr/local/mysql/bin/mysqladmin


 

unique

[[email protected] ~]# pkill mysql     // 杀死有mysql的进程

UNI

 

表示记录不能重复

另一种启动mysql的方法:把mysql自己的启动脚本拷贝到init.d里面

 

[[email protected] mysql]# pwd

例子:

/usr/local/mysql/share/mysql

> create table user(name char(10),email varchar(20) unique);

[[email protected] mysql]# cp mysql.server /etc/rc.d/init.d/    // 可以改名的比如说改成mysqld

> insert into user values("Anna","[email protected]");

[[email protected] mysql]# service mysql.server restart

> insert into user values("Nana","[email protected]");

 

ERROR 1062 (23000): Duplicate entry '[email protected]' for key 1


 

问题排查:

 

如果数据库初始化没成功,可能是下面的原因:

unique字段null是允许的

[[email protected] mysql]# grep mysql /etc/passwd 首先要有mysql这个用户

mysql> insert into user values();

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

mysql> insert into user values();

[[email protected] mysql]# /etc/init.d/mysqld stop  原来装了一个mysql 的rpm包,而且启动了,先停掉

mysql> select * from user;

停止 MySQL:                                               [确定]

------ --------------

[[email protected] mysql]# rpm -q mysql 把原来装的rpm包卸载掉

| name | email        |

mysql-5.0.45-7.el5

------ --------------

[[email protected] mysql]# rpm -e mysql --nodeps

| Anna | [email protected] | 

 

| NULL | NULL         | 

本文由ca88手机版登录发布于亚洲城ca88手机版官网,转载请注明出处:Mysql编译安装

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。