开发者社区> 技术小阿哥> 正文

mysql数据库详解

简介:
+关注继续查看

IO理论知识

同步、异步、阻塞、非阻塞

同步:系统调用一个函数、并不会立即完成而是等待外部调用工作完成后才结束。

阻塞:系统调用一个功能,同样不会立即完成,并等待io完成,直到io完成才结束。

非阻塞:系统调用一个功能,并很快返回一个未完成的状态结果,并定期轮询查看进程执行情况,称为非阻塞。

异步:系统发起一个调用请求后,继续执行其他进程,待结束后,返回一个结果信息。

linux优先级:priority

    实时优先级:1-99,数值小,优先级低

    静态优先级:描述用户状态,100-139,数值小,优先级高


实时优先级比静态优先级高

通过top可以查看进程当前的优先级,通过nice来调整优先级,由于用户优先级是100-139,而nice调整的范围是-20 至 19,可以推断出用户优先级默认是120。


调度类型:

    实时进程:

             sched_fifo:先进先出队列 FF

                sched_rr:轮训调度

         sched_other:调度用户空间进程 TS

    动态优先级:对于长期不能得到相应的优先级低的进程,会临时调整优先级,主要对sched_other类型进行调整。


手动调整优先级:nice

100-139之间

    对于未启动的进程设置优先级

                nice n command 

    对于已启动的进程设置优先级

                renice -n process-id

1-99之间

        chrt

-f:fifo类别

-r:rr类型

-o:other类型

例如:chrt -f -p [prio] pid

启动一个进程直接设置优先级,chrt -f -p [prio] command


web服务器内核工作常见协议


CGI协议

CGI是通用网关接口,主要负责web服务器前端和后面解释器、应用环境的通信,举例说:一个用户请求一个WEB页面,如果这个请求是一个静态页面请求,那么直接由httpd、nginx处理即可,如果请求的是一个需要进行计算的动态页面,那么这个请求就要涉及到具体的解释器或者应用程序,这个通常是在编写网页的时候就应经制定的比如php、jsp、tomcat等应用程序,这个时候httpd与php之间就需要CGI来作为通信协议保证之间的正常通信了。

httpd会主动生成一个进程来处理动态请求,并在动态请求结束后进行销毁工作。

在CGI的协议下,由于IO工作模型不同,有一下几种模型:

1、单进程阻塞工作

由于是工作在阻塞模式下,前端httpd只可以接受一个动态请求,直到请求处理结束后才处理第二个请求。

2、perfork工作机制: 客户端请求服务,httpd会有一个主进程专门用来派发动态请求,服务器的主进程对服务请求进行相应,并分配一个空闲进程来对客户端服务进行处理,一个进程只能处理一个请求。主进程只负责接收请求并派发给空闲进程。即实现多路io复用。

缺点:对于大量访问,需要分配大量子进程,消耗cpu资源,造成浪费

解决方法:线程的使用worker。

worker工作机制:客户端发起请求服务,服务器的主进程后面会有多个工作进程,并且会将请求分配到工作进程的线程里面去,实现多进程多线程的工作模式。

缺点:追踪问题困难

event模型:同样是一个主进程接受客户端请求并派发,子进程采用AIO模式,一个进程可以接受多个请求,不存在上下文切换。

上下文切换:不同进程或线程直接在请求信息和完成请求的时候会产生切换,称为上下文切换,上下文切换会造成资源大量损耗。

Fast-CGI协议

CGI是通过web服务器(httpd、nginx)来生成一个调用CGI的进程,这个进程是立即生成并调用的,同时维护CGI的完成。而FASTCGI采用C/S架构,自身独立于web服务器产生一个“服务器”,用来接收web服务器的关于动态请求,这个“服务器”工作方式类似prework,它是事先生成空闲进程,当web服务器需要调用动态请求的时候,这个“服务器”会随时调用空闲进程,这样为web服务器节约了cpu资源,并且也提高了访问速度。

有了fastCGI可以实现web服务器的动静分离。


动态网站开发语言

php:mysql

jsp:tomcat

python:mod_python (UWSGI,性能优于fastCGI)

ruby

数据模型引入

2-8法则:一小部分的数据被大量访问,而另外大部分数据访问很少,也就是数据的局部性。

数据管理系统

数据库引擎

数据模型:

                层次模型

                网状模型

                关系模型

数据库范式:用于规范数据模型,有第一,第二、第三第四范式。

关系运算:

            交叉连接:                

            投影:挑选列

            选择:挑选行

操作:

        read、creat、update、delete等。

        

数据库管理系统DBMS设计目标

1、数据冗余和不一致问题。

2、数据查找困难问题

3、解决数据的孤立性(耦合问题)

4、完整性问题

数据库访问驱动(访问接口):外部用于访问、查询、删除数据库内容的接口。不同程序访问数据的驱动接口是不同的。

0B776426846F4F7D86EFEDE47A19D7CB


通用数据库访问接口驱动:适用于各种程序访问数据库,但是比较底层,操作困难。比如ODBC。

专用数据库访问驱动:

JDBC:java程序专用

mysql被oracle收购后,原作者研发了新的mariaDBS数据库。

postgreSQL性能远远强大于mysql、oracle。

RHEL7,默认安装mariaDB,percona。

MYSQL


mysql服务:mysqld (mysql-server)

端口:3306/tcp

用户:username@host

        默认用户:root,密码:空

mysql客户端(mysql)

用户:默认是root

-u:用户名

-h:主机名

-p:密码

如果不加任何参数表示已root用户在本地登录,密码为空。

官网上常用的软件包:mysql community server (mysql软件包免费),mysql workbench(设计数据库工具包),mysql utilities (管理包),mysql proxy (代理),mysql connetcors (专用程序链接mysql的驱动)

客户端命令:不用分号结束

        use db_name:设置db_name为默认数据库。

服务器端命令:必须使用分号结尾。

        show databases;显示有访问权限的所有数据库

        select databse();:显示默认数据库

        create database mydb;:创建mydb数据库

        drop database mydb;:删除mydb数据库

存储引擎:将数据库的逻辑结构比如表、索引,链接等逻辑数据信息存储在物理磁盘上,并可以实现物理数据和逻辑数据之间的链接和查找功能。

mysql的存储引擎有10多种,功能各不相同,最常见的是myisam和innodb。

php链接mysql的测试:

<hi>nihao a <hi>

<?php

    $link=mysql_connect(localhost,root,"");

        if($link)

                echo "sueccess....";

        else

                echo"failure....";

?>

linux+httpd+php+mysql:LAMP

个人建站系统:

wordpress

phpwind

phpbb

drupal

joomla

discuz

phpmyadmin:用于管理mysql数据库

要求:用户名,密码必须完整且不能空密码登陆。

设置mysql用户名,密码

set password for 'root'@localhost =password('redhat'), 设置本地用户名为root,密码为redhat

启用密码

flush privileges;

965CA6A27A71403E9A2CEB0C9E23F55D

php:适合小型网站的编程,由于自身问题,php公司研发了hiphop来将php翻译成c++代码,提供效率。

jsp:大型网站编程

SQL语句:统一标准由ANSI来定义,但各个数据库厂家的sql语句还是有区别的,比如mysql使用sql,sqlserver使用t-sql、oracle使用pl/sql。


第二节  安装MYSQL数据库


一、安装方式:

   1、通过系统自身自带安装,os vender:mysql mysql-server,mysql-devel(开发使用)

   2、源码编译:优势是可以指定自己需求,优化性能。

        编译安装一般步骤:

            a、创建用户和用户组

                     useradd -s /bin/nologin mysql

            b、解压缩源码包,并指定解压位置。

                    tar -zxf mysql.tar.gz -C /usr/local/mysql

            c、为了方便可以创建快捷方式-软连接。

                    ln -s /usr/local/mysql  /mysql

            d、编译安装mysql。 mysql5.5之后编译安装采用cmake的方式,需要先安装cmake,git。如果是mysql5.7及以上版本需要安装boost,下载boost后需要编译安装boost,方法是:bash bootstrap.sh后执行bjam

[root@localhost mysql-5.6.29]# yum install cmake git


boost安装参考:http://blog.csdn.net/simtwo/article/details/8083598

                  

    1、安装cmake软件包

                    2、确定编译环境,其实所有编译安装都是需要确定编译环境的。

[root@localhost mysql-5.6.29]# yum install gcc gcc-c++

安装开发环境依赖的软件包组:

Development Tools

Server Platform Development

Desktop Platform Development

安装

[root@localhost mysql-5.6.29]# cmake -DCMAKE_INNOBASE_STORAGE_ENGINE=1 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_CHARSET=utf8 -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_USER=mysql -DSYSCONFDIR=/etc 

                    注意:参数都是使用大写方式。

以下适用于编译安装方式:

1、 导出帮助文件(使用man 的功能)

通常man文件位于/usr/local/mysql/man中(编译安装),通过修改mysql的man.config文件来进行添加man路径即可。添加MANPATH  /usr/local/mysql/man。

2、导出头文件:将编译安装的mysql文件目录中的incloud目录链接到/usr/incloud/mysql中。

设置动态库文件查找:一般情况命令执行需要的动态库文件会查找/lib、/usr/lib目录以及/etc/ld.so.conf配置文件,当然也就是在ld.so.conf.d目录下创建单独的配置文件,只要指明库文件的位置即可。

命令:ln -sv /usr/local/mysql/incloude /usr/include/mysql

3、导出库文件:

命令:vim /etc/ld.so.conf.d/mysql.conf   指定库文件,首先需要创建mysql.conf文件,然后在文件里面讲mysql的库文件路径添加进来,通常是/usr/local/mysql/lib。

ldconfig -v |grep mysql   //查看库文件是否已经注册,主要看libmysqlclient.so.18->libmysqlclient_r.so.18.0.0

   3、通用二进制格式程序包,tarball(类似绿色版)

           数据包格式通常是tar的归档类型。并且建议所有mysql数据存储位置都应该是lvm类型的磁盘格式,这样便于数据的备份(快照)。通常是安装到/usr/local/mysql中,数据默认也是存储在/usr/local/myql/data/目录下。创建mysql用户和mysql组,然后为安装目录创建软连接,ln -s    原目录  创建的链接目录。

   4、rpm软件包

数据默认存储位置是/var/lib/mysq/data/目录下。此安装方式安装过程中,需要先删除之前系统中自带的早期的mysql-libs库文件,否则会包如下错误:

事务测试出错:

  file /usr/share/mysql/czech/errmsg.sys from install of MySQL-server-5.6.36-1.el6.x86_64 conflicts with file from package mysql-libs-5.1.73-5.el6_6.x86_64


mysql_server       服务器端软件

mysql_client        客户端软件

mysql_bench      测试及基准程序,需要perl支持

mysql_devel        编写其他mysql和客户端的函数库和文件

mysql_share        共享函数库

rpm安装,至少需要安装server和client软件,数据库通常放在/var/lib/data目录下。

warning: MySQL-client-5.6.36-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY

Preparing...                ########################################### [100%]

   1:MySQL-client           ########################################### [100%]

[root@localhost ~]# rpm -ivh MySQL-devel-5.6.36-1.el6.x86_64.rpm-5.6.36-1.el6.x86_64.rpm 

error: open of MySQL-devel-5.6.36-1.el6.x86_64.rpm-5.6.36-1.el6.x86_64.rpm failed: 没有那个文件或目录

[root@localhost ~]# rpm -ivh MySQL-devel-5.6.36-1.el6.x86_64.rpm

warning: MySQL-devel-5.6.36-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY

Preparing...                ########################################### [100%]

   1:MySQL-devel            ########################################### [100%]

[root@localhost ~]# yum install MySQL-server-5.6.36-1.el6.x86_64.rpm 

已加载插件:fastestmirror

设置安装进程


诊断 MySQL-server-5.6.36-1.el6.x86_64.rpm: MySQL-server-5.6.36-1.el6.x86_64



复制启动脚本

[root@localhost ~]# cp /usr/share/mysql/mysql.server /etc/init.d/mysqld

[root@localhost ~]# service mysqld start

Starting MySQL. SUCCESS! 


通过rpm安装的mysql,会随机生成一个root的密码并将密码存放在/root/.mysql_secret。复制这个秘钥串,并进入mysql后重新登录并设置密码

[root@10 ~]# cat /root/.mysql_secret

# The random password set for the root user at Fri Jul 21 22:34:21 2017 (local time): O0UC3_Mv888DFpQ1

[root@10 ~]# mysql -u root -p

Enter password: 


mysql> SET PASSWORD = PASSWORD('123456');

Query OK, 0 rows affected (0.00 sec)


mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

rpm安装的mysql默认配置文件在/usr/my.cnf,复制一个新的到/etc/my.cnf。并添加以下内容:

port            = 3306

datadir = /mysqldata/data

socket  = /mysqldata/data/mysql.sock

pid-file = /mysqldata/data/mysqld.pid

log-error = /mysqldata/data/mysql.err



参考文件:http://blog.csdn.net/bbaibb1009/article/details/50518218

RPM方式安装MySQL5.6http://blog.csdn.net/liumm0000/article/details/18841197

然后初始化mysql_install_db,进入数据库创建root账户

mysql> use mysql;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A


Database changed

mysql> update user set password=password('123123') where user='root';

Query OK, 4 rows affected (0.00 sec)

Rows matched: 4  Changed: 4  Warnings: 0

退出后重新登录

mysql> set password for 'root'@‘%localhost‘=password('123123');


常见问题:

1、通过rpm安装过程中,出现conflicts with 5.xx的情况,说明系统的mysql-libs库使用的版本低于目前需要安装的版本,才会造成版本冲突,解决方法就是删除早期版本的libs

方法:yum remove mysql-libs

2、mysql的开机启动脚本通常是mysql.server文件,一般位置在/usr/share/mysql/mysql.server,如果不能找到可以通过rpm -qpl mysql-server-5.xxx.rpm |grep server的方式查找。

3、一般mysql的配置文件存放在/etc/mysql.cnf。如果没有或者丢失,可以通过rpm -qpl mysql-server-5.xxx.rpm |grep cnf的方式查找。

4、Curses library not found. Please install appropriate package

     处理方法:1、删除CMakeCache.txt文件。

                       2、yum install ncurses-devel     debian,ubuantu需要安装libncurses5-dev。

5、开启服务提示sock错误:

error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)' 

Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!

通常需要修改my.cnf配置文件,将[mysqld]的socket和[mysql]的socket均设置为同一个路径。

6、出现120223 21:29:59 mysqld_safe mysqld from pid file /usr/local/mysql/data/localhost.localdomain.pid ended问题。

删除mysql安装目录下data目录下的ib开头的所有文件。

my.cnf

7、/usr/bin/mysqladmin: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory

解决办法:重新安装mysql-libs文件。http://www.cnblogs.com/ayanmw/p/3434028.html

[root@www data]# ll

total 94224

drwx------. 2 mysql mysql     4096 Mar 15 03:04 ec_school

-rw-rw----. 1 mysql mysql 85983232 Mar 16 03:08 ibdata1

-rw-rw----. 1 mysql mysql  5242880 Mar 16 03:08 ib_logfile0

-rw-rw----. 1 mysql mysql  5242880 Mar 16 03:08 ib_logfile1

drwxr-x---. 2 mysql root      4096 Mar  8 01:20 mysql

drwx------. 2 mysql mysql     4096 Mar  8 02:14 performance_schema

drwx------. 2 mysql root      4096 Mar  8 02:12 test

8、出现无法启动*.pid文件的处理办法参考以下链接http://www.jb51.net/article/48625.htm,主要是解决权限和enforce的问题。

二、数据库初始化

目的:创建mysql许可表。可以初始化登录用户、数据库存放位置、源码位置等信息。

命令: mysql_install_db   -user=mysql --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data 

                --user=                  //以某个用户身份执行,一般是mysql

                --datadir=         //指定数据库位置

                --basedir=     //指定mysql的安装路径。

information_schema和performance_schema是类似linux的proc目录,显示的信息都是虚拟化的临时信息。

三、设置权限

将mysql安装目录设置为属主和属组均为mysql用户。

chown -R mysql:mysql /usr/local/mysqld

四、启动服务

启动服务:./bin/safe_mysqld --user-mysql &

停止服务:./bin/mysqladmin shutdown

开机启动服务,添加内容到配置rc.local文件:/bin/sh -c  '/usr/local/mysql: /bin/mysqld_safe'



本文转自 blackstome 51CTO博客,原文链接:http://blog.51cto.com/137783/1968771,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Redis --- redis事务和分布式事务锁
Redis --- redis事务和分布式事务锁
3 0
数据结构与算法必知--- Bitmap位图与布隆过滤器
数据结构与算法必知--- Bitmap位图与布隆过滤器
3 0
Java并发 --- ThreadLocal简述
Java并发 --- ThreadLocal简述
4 0
Python 面向对象 8: 异常
Python 面向对象 8: 异常
4 0
Maven 部署成品
上传设置 1. settings.xml 中设置仓库凭证:servers 节点中添加如下配置.[如果未加密则可跳过] <server> <id>releases</id> <username>************</username> <password>************</password> </server> <server> <id>snapshots</id> <username>************</username> <password>********
4 0
从零开始学设计模式(四):工厂模式(Factory Pattern)
工厂模式(Factory Pattern)也是 Java中最常用的设计模式之一。这种类型的设计模式也属于创建型模式,它提供了一种创建对象的最佳方式。
2 0
13692
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载