技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

mysql主从复制,半同步,主主复制架构的实现

 mysql的数据同步功能,不仅在一定程度上提供数据库查询时的负载均衡,而且为实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助。而数据的同步功能可以通过主从复制来实现,而主从复制是异步进行的,并且mysql仅支持一主多从,不支持一从多主的复制模型。 1,主从复制的原理:(如下图) 第一步:在每个更新数据的事物完成之前,主服务器都会把数据更改记录到二进制日志中。即使事物在执行期间是交错的,mysql也会串行地把事物写入到二进制日志中,写入完成之后,主服务器告诉存储引擎调交事物。第二步:从服务器把主服务器的二进制日志拷贝到自己的硬盘,即"中继日志"中。首先,它启动一个工作线程,叫I/O从线程。这个I/O线程开启一个普通的客户端连接,然后启动一个特殊的二进制日志存储进程(binlog dump)进程。这个转储进程从主服务器的二进制日志中读取事件,它不会对事物进行轮询。如果它跟上了主服务器,就会进入休眠状态,并等待有新的事件发生时主服务器发出的信号,I/O线程把事件写入到从服务器的中继日志中。第三步:SQL从线程读取中继日志,并且重放其中的事件,然后更新从服务器的数据。由于这个进程能跟上I/O线程,中继日志通常都在操作系统的缓存中,所有中继日志的开销很低。SQL从线程执行的事件也可以被写入从服务器自己的二进制日志中或是不写。 ... 全文

mysql复制的原理 mysql半同步功能 mysql的复制 mysql主主复制 mysql主从复制

简单几步搭建个人博客(WordPress)

简单几步搭建个人博客(WordPress)        如今,像腾讯,CSDN等一些公司都提供了个人博客、个人空间这样的功能,其实博客有很多的作用,它可以让我们自由的表达出自己的想法,让我们进行知识的过滤和积累,是我们进行深度交流沟通的网络新方式,同时也可以展示自己在某些方面的见解,并与其他人分享。但是,如果某一天这样的公司不再运营,那么它是否还会提供给我们这样的个人空间功能呢,我们以前所总结、所分享的一些经验见解是否还依然存在呢? 今天,我给大家展示一下如何搭建一个完全属于自己的博客,你不会因为某某公司的决定而影响到自己的空间,而且,也不需要你有太多的知识需要掌握,你不需要掌握像jsp,asp,php这些制作网站方面的web语言,也不需要掌握像java,c++这样的编程语言,你所需要的就是linux系统的基本了解,这样的博客你可以进行任意的修改空间排版,尽情的修改(不过这个就需要你有一些网页制作方面的知识了),说了这么多就是让大家知道为什么要搭建这样的博客,这样的博客有什么作用,好了,不废话了,下面开始正文。。。 准备的知识:linux系统的简单操作,会配置apache或nginx服务器,安装mysql数据库,php知识了解一点就可以 所需硬件:一个带有linux系统的计算机,配置不需很高,自己平时用的电脑都可以。 所需软件:nginx ,  MySQL , PHP,(不需要你掌握这些东西,只要了解就可以,不过要是连听都没听过,那么就难了),Secure Shell Client, putty,  VCN等一些远程控制软件,只需其中一种就可以(如果linux系统在你自己的电脑上面,那就不需要远程控制软件了),还有最重要的一个就是WordPress,这才开始引入整体,我们做的博客需要用到WordPress。WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL 数据库的服务器上架设自己的网站。 好了,介绍了一些提前所需的准备,那么接下来就开始搭建了。 我以我的搭建为例,我的情况是这样的:我在我们学校里有一台linux服务器(这个就需要你自己办了),我自己电脑是windows系统,用的是Secure Shell Client(简称SSH)远程控制软件,服务器使用nginx配置的。如何配置nginx服务器,我这里就不提了,如果你了解linux,就很容易搭建了,而且网上教程也很多。其实wordpress的搭建网上也有很多的教程,也有官方的教程,不过那些教程我感觉不太实用,所以就自己总结了一个这样的搭建方式,仅供大家参考。 一、打开SSH控制软件,远程连接好linux服务器,拷贝所需要的软件到一个目录当中                               图一 phpmyadmin这个软件是用来进行数据库操作的,这是一个很好的可视化操作软件,如果对数据库操作比较熟练,也不需要这个软件。 基本的nginx配置,mysql安装,我这里不介绍了,不会的看看网上的教程(谷歌一下:如果搭建LNMP(linux nginx mysql php)服务器,会有一大堆的信息)。 二、首先建好自己的目录图二 我这里在/home/www目录下建立了一个web目录,用来放自己的网站。 三、将wordpress解压到这个目录(事先将wordpress上传到服务器中)图三 解压命令:图四 四、进入wordpress目录,文件如下:图五 五、建立一个nginx_conf文件夹,在此文件夹里建一个配置文件,名字可以随意叫 eg:web.com.conf图六 六、编辑web.com.conf文件,内容如下:    server             {                       listen       80;           #80端口开放                       server_name  www.sotaof.com;  #此处是域名,这里是我的域名                       index  index.html index.htm index.php default.html default.htm default.php;    #默认打开的文件的顺序,如果没有依次查找                       root  /home/www/web/wordpress;   #博客的根目录                       location  ~ .*\.(php|php5)?$                                {                                         try_files  $uri =404;                                         fastcgi_pass  unix:/tmp/php-cgi.sock;                                         fastcgi_index  index.php;                                         include  fcgi.conf;                                }                       location  ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$                                {                                         expires      30d;                                }                       location  ~ .*\.(js|css)?$                                {                                         expires      12h;                                }                       access_log  off;             }    七、编辑nginx的配置文件nginx.conf,此文件在/etc/nginx/conf/目录下 此文件的后面,括号里的最后一样加上:    include /home/www/web/nginx_conf/*.conf    八、重启nginx服务    service nginx restart    九、到了这时,如果你有域名的话,那么就对你的域名进行解析吧,在你注册域名的网站上面进行解析,我在美橙网站注册的域名,然后将解析权限交个dnspod了(www.dnspod.com),解析过程就比较简单了,这里不再陈述。 访问www.sotaof.com,可以看到:图七 (出现了错误,不过这里已经成功一大半了,错误一会儿我们再解决) 如果没有域名怎么办呢,我只有ip,那么我们这样做: 返回第五步,不需要建立web.com.conf文件了,直接打开nginx的配置文件nginx.conf,在这个配置文件里面进行这样的修改:    server             {                       listen       80;                       server_name www.sotaof.com;  #域名                       index  index.html index.htm index.php;   #读取文件的顺序                       root  /home/www/web/wordpress;    #网站的根目录                       location  ~ .*\.(php|php5)?$                                {                                         try_files  $uri =404;                                         fastcgi_pass  unix:/tmp/php-cgi.sock;                                         fastcgi_index  index.php;                                         include  fcgi.conf;                                }                       location  /status {                                stub_status  on;                                access_log   off;                       }                       location  ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$                                {                                         expires      30d;                                }                       location  ~ .*\.(js|css)?$                                {                                         expires      12h;                                }                       access_log  /home/logs/access.log  access;             }    修改记录请见红色加粗部分。 修改之后,执行第八步,重启nginx服务。 访问你的服务器的ip地址,同样会见到刚才出错网页的画面(图七)。 十、好了,到这里如果没有域名的问题也解决了,那么怎么处理刚才那个出错问题呢,它提示的问题是wp-config.php文件不存在。先不管它,咱们点击“创建一个配置文件”,跳转的页面如下:图八 十一、      点击“现在就开始”,跳转的页面如下:图九 十二、      好了,到了这里还需要做一件事情,那就是需要建立数据库,也就是在你的mysql数据库中新建一个数据库。这里我就简单演示一下: 1、  首先登陆mysql,执行命令:”mysql  –u用户名  –p密码”图十 2、  创建数据库,执行命令:”createdatabase 数据库名称”图十一                    3、退出,执行命令:”quit”,这样数据库就建立完成了。 十三、      数据库建好之后,我们继续。。。填好图九的信息,信息如下:图十二                    数据库名:就是刚才创建的blog数据库                    用户名和密码就是你数据库登录的用户名密码                    数据库主机:可以使localhost,也可以是服务器的ip                    表名前缀:就用wp吧,改成其他的也行 十四、      点击“提交”,信息的网页信息如下:图十三 出现了错误提示,以为wp-config.php文件没有找到,也就是刚才图七的错误。知道了问题所在,那么就开始解决吧,查看wordpress目录下的文件图十四 没有wp-config.php文件,但是有一个wp-config-sample.php文件,这个文件是一个模板,我们可以按照这个模板编辑wp-config.php文件,那么就在这个目录新建一个wp-config.php文件,编辑内容如下:    <?php    /**    *  WordPress 基础配置文件。    *    * 本文件包含以下配置选项:MySQL 设置、数据库表名前缀、密匙、    *  WordPress 语言设定以及 ABSPATH。如需更多信息,请访问    *  {@link http://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php    * 编辑 wp-config.php} Codex 页面。MySQL 设置具体信息请咨询您的空间提供商。    *    * 这个文件用在于安装程序自动生成 wp-config.php 配置文件,    * 您可以手动复制这个文件,并重命名为“wp-config.php”,然后输入相关信息。    *    *  @package WordPress    */       // ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //    /** WordPress 数据库的名称 */    define('DB_NAME', '此处是刚才创建的数据库名称');       /** MySQL 数据库用户名 */    define('DB_USER', '此处是数据库登录的用户名');       /** MySQL 数据库密码 */    define('DB_PASSWORD', '此处是数据库登录的密码');       /** MySQL 主机 */    define('DB_HOST', 'localhost');       /** 创建数据表时默认的文字编码 */    define('DB_CHARSET', 'utf8');       /** 数据库整理类型。如不确定请勿更改 */    define('DB_COLLATE', '');       /**#@+    * 身份认证密匙设定。    *    * 您可以随意写一些字符    * 或者直接访问 {@link https://api.wordpress.org/secret-key/1.1/salt/  WordPress.org 私钥生成服务},    * 任何修改都会导致 cookie 失效,所有用户必须重新登录。    *    *  @since 2.6.0    */    define('AUTH_KEY',         '|NfV*VSB4.4`2RNxDw2|tvU87*6[j{gr|Aqljw15kOi33T,{7-ogs80$2}8t-`~w');    define('SECURE_AUTH_KEY',  'QDx_hwiB  >-h}bn*.j}m;!=F]<?k4k*>)S8W,`cu)c0v)~whfQ0S=Vq0fWLG4<G1');    define('LOGGED_IN_KEY',    'hD,,as|dbD>TSZX3^{N`|6se  Y7BtB9f5V`]kJnYC7|7~D #n**p~8Q(@xsS&~3/');    define('NONCE_KEY',         '-FT8^llL}727xznbNR#`Gr|($OgL%xb#4%e7BX58m?SBhxsqY$|7,FNkI*TuXs@]');    define('AUTH_SALT',        '$OL  (|XDXb}Pk}y=1[}50D#{DR:N(1hx.w+%dPie)+z@AV-k)V@y+w~A;WteR9lw');    define('SECURE_AUTH_SALT', 'S&k{H:  FQ(qB=a$ %-?b!F@gwLcLo[rY&+:6% t<~_+V9LZo(D/xn0//a#@.{T');    define('LOGGED_IN_SALT',   '}~Aa`idgYF=7aK(3?{C+7*/<Yl)yZ;tSd  8Y`O$j=pgx<(/MbL;!VgFB]hs>{L=M');    define('NONCE_SALT',        'E?Ha4<+{/!4,wCf}&}+4Emel(~,?}6k&~}68Tt:yy&;O-A{qoaM..$`%DeR53.|');       /**#@-*/       /**    *  WordPress 数据表前缀。    *    * 如果您有在同一数据库内安装多个 WordPress 的需求,请为每个 WordPress 设置不同的数据表前缀。    * 前缀名只能为数字、字母加下划线。    */    $table_prefix  = 'wp_';       /**    *  WordPress 语言设置,中文版本默认为中文。    *    * 本项设定能够让 WordPress 显示您需要的语言。    *  wp-content/languages 内应放置同名的 .mo 语言文件。    * 要使用 WordPress 简体中文界面,只需填入 zh_CN。    */    define('WPLANG', 'zh_CN');       /**    * 开发者专用:WordPress 调试模式。    *    * 将这个值改为“true”,WordPress 将显示所有用于开发的提示。    * 强烈建议插件开发者在开发环境中启用本功能。    */    define('WP_DEBUG', false);       /* 好了!请不要再继续编辑。请保存本文件。使用愉快! */       /** WordPress 目录的绝对路径。 */    if ( !defined('ABSPATH') )             define('ABSPATH',  dirname(__FILE__) . '/');       /** 设置 WordPress 变量和包含文件。 */    require_once(ABSPATH .  'wp-settings.php');    十五、      编辑好内容之后,回到图十三,点击“进行安装”,跳转页面:图十五 十六、      站点标题:自己随便命名 用户名:登录管理后台的用户名 密码:登录管理后台的密码 电子邮件:自己填写吧 点击安装wordpress 提示页面:图十六 十七、      点击“登录”,跳转页面:图十七 十八、      登录之后的跳转的页面如下:图十八 十九、      点击左上角,查看站点图十九 二十、      到此,一个博客已经建好了,接下来就可以开始写文章了!本文为网服队员(sotaof)原创,如若转载请注明转载来源:http://bbs.wfcsu.com/forum.php?mod=viewthread&tid=868&page=1&extra=#pid1863... 全文

mysql MySQL Mysql MYSQL MySql mysqL nginx Nginx php PHP Php wordpress Wordpress WordPress 搭建博客

mysql基本管理命令

在此将介绍MySQL数据库的一些基本管理操作,包括如何登录,退出MySql环境及管理数据库、表的常用SQL语句。1、登录及退出MySql环境:使 用MySql客户端命令工具"mysql"可以连接并登录到MySql环境,在带有提示符“mysql>”的交互式命令环境中进行操作。在该操作环 境中,输入的每一条数据库管理命令以分号“;”表示结束,可以不区分大小写(但习惯上将SQL语句中的关键字使用大写)。... 全文

mysql mysql操作 mysql管理员 mysql管理

mysql之编译安装mysql,以及mysql mysqladmin工具的使用说明。

   mysql的编译安装不是使用./configure 而是使用cmake,这点大家需要注意:    一:安装好编译环境,三个包组:“Development tools”                                  “Desktop platform Development”... 全文

mysql mysqladmin 编译安装mysql

mysql互为主备

有server1=192.168.0.17 和 server2=192.168.0.18俩台mysql server其中;server1主机上配置server-id=1      server2上配置:server-id=2 17 Server1上mysql的配置:linux 内核:#uname -r2.6.32-220.el6.x86_64 mysql版本:#mysql -u root -p Enter password:输入mysql密码mysql> status-------------- ...............................mysql  Ver 14.14 Distrib 5.5.22, for Linux (x86_64) using  EditLine wrapper  //数据版本号 ................................--------------//创建mysql同步用户,只允许bak这个用户通过192.168.0.18这台主机上连接。mysql>grant replication slave on *.* to bak@192.168.0.18 identified by 'wdmysql'; 编辑mysq1主配置文件,在/etc/my.cnf中添加以下内容 server-id = 1   #最好是找到这一行,省的手工添加避免冲突, character_set_server=utf8log-bin = mysql-bin binlog-ignore-db = mysql binlog-do-db = bbsdb binlog-do-db = phpmyadmin replicate-do-db = phpmyadmin binlog-ignore-db = test # master-host = 192.168.0.18 #master-user = bak #master-password = wdmysql #master-port = 3306  #master-connect-retry = 60 replicate-ignore-db = mysql replicate-ignore-db = test replicate-do-db = bbsdb //重新启动mysql server#server mysql restart 18  Server2上mysql的配置:linux 内核:#uname -r2.6.32-220.el6.x86_64 mysql版本:#mysql -u root -p Enter password:输入mysql密码mysql> status-------------- ...............................mysql  Ver 14.14 Distrib 5.5.22, for Linux (x86_64) using  EditLine wrapper  //数据版本号 ................................--------------创建mysql同步用户,只允许bak这个用户通过192.168.0.17这台主机上连接。grant replication slave on *.* to bak@192.168.0.17 identified by 'wdmysql'; 编辑mysq2主配置文件,在/etc/my.cnf中添加以下内容 [mysqld]       #找到这一行,在这个下面添加以下内容;server-id = 2                               #//最好是找到这一行,省的手工添加冲突, character_set_server=utf8          #这个对本次试验没有时间用处,在网上看见有人改mysql字符集报错,随便我在这给加上了 #master-host = 192.168.0.17         # 指定主服务器IP地址 #master-user = bak                        # 指定在主服务器上可以进行同步的用户名 #master-password = wdmysql            # 密码 #master-port = 3306                         # 同步所用端口 #master-connect-retry = 60               # 断点从新连接时间 replicate-ignore-db = mysql             # 屏蔽对mysql库的同步 replicate-ignore-db = test            # 屏蔽对test库的同步 binlog-ignore-db =mysqlreplicate-do-db = bbsdb                      # 同步的数据库的名称 binlog-do-db = bbsdb                      # 二进制需要同步的数据库名 replicate-do-db = phpmyadmin                     # 同步的数据库的名称 binlog-do-db = phpmyadmin                      # 二进制需要同步的数据库名 binlog-ignore-db = test  //上面带有 "master_" 都被我注释掉了,因为我的mysql不支持这些参数; 然后重新启动mysql服务,#server mysql restart //下面的步骤都需要在俩台mysql上操作一遍; #mysql -u root -p Enter password:输入mysql密码..................mysql> stop slave;mysql> start slave;mysql> show slave status\G //主要看这两行,是否都为“yes”,如果不是,请查看日志文件,一般都有提示;................................. Slave_IO_Running: Yes  Slave_SQL_Running: Yes.................................... //一般情况Slave_IO_Running:会出现NO,Slave_SQL_Running一般没事,如果出现以下情况请执行以下操作; 先登录mysql。执行以下命令。 mysql> show slave status\G *************************** 1. row ***************************                Slave_IO_State:                   Master_Host: 192.168.0.18                   Master_User: bak                   Master_Port: 3306                 Connect_Retry: 60               Master_Log_File: mysql-bin.000003           Read_Master_Log_Pos: 107                Relay_Log_File: server7-relay-bin.000002                 Relay_Log_Pos: 253         Relay_Master_Log_File: mysql-bin.000003              Slave_IO_Running: No            Slave_SQL_Running: Yes               Replicate_Do_DB: phpmyadmin,bbsdb           Replicate_Ignore_DB: mysql,test            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 0                    Last_Error:                  Skip_Counter: 0           Exec_Master_Log_Pos: 107               Relay_Log_Space: 411               Until_Condition: None                Until_Log_File:                 Until_Log_Pos: 0            Master_SSL_Allowed: No            Master_SSL_CA_File:            Master_SSL_CA_Path:               Master_SSL_Cert:             Master_SSL_Cipher:                Master_SSL_Key:         Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No                 Last_IO_Errno: 0                 Last_IO_Error:                Last_SQL_Errno: 0                Last_SQL_Error:   Replicate_Ignore_Server_Ids:              Master_Server_Id: 2 1 row in set (0.00 sec)  从上面的状态可以看到,此时从主库无法同步;然后登录server1主数据库,允许从数据库同步相关数据; mysql> grant replication slave on *.* to bak@192.168.0.18 identified by 'wdmysql'; 再次重启从数据库,登录进去查看状态时,如果还是不行的话再继续往下操作。 mysql> stop slave;//先到另一台mysql上查看 mysql> show master status;+------------------+----------+------------------+------------------+ | File             | Position | Binlog_Do_DB     | Binlog_Ignore_DB | +------------------+----------+------------------+------------------+ | mysql-bin.000003 |      107 | bbsdb,phpmyadmin | mysql,test       | +------------------+----------+------------------+------------------+ 1 row in set (0.00 sec) //在server1上操作mysql> change master to master_host='192.168.0.18',master_user='bak',master_password='wdmysql',master_log_file='mysql-bin.000003',master_log_pos=107; mysql> start slave; mysql> show slave status\G *************************** 1. row ***************************                Slave_IO_State: Waiting for master to send event                   Master_Host: 192.168.0.18                   Master_User: bak                   Master_Port: 3306                 Connect_Retry: 60               Master_Log_File: mysql-bin.000003           Read_Master_Log_Pos: 107                Relay_Log_File: server7-relay-bin.000003                 Relay_Log_Pos: 253         Relay_Master_Log_File: mysql-bin.000003              Slave_IO_Running: Yes             Slave_SQL_Running: Yes              Replicate_Do_DB: phpmyadmin,bbsdb           Replicate_Ignore_DB: mysql,test            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 0                    Last_Error:                  Skip_Counter: 0           Exec_Master_Log_Pos: 107               Relay_Log_Space: 557               Until_Condition: None                Until_Log_File:                 Until_Log_Pos: 0            Master_SSL_Allowed: No            Master_SSL_CA_File:            Master_SSL_CA_Path:               Master_SSL_Cert:             Master_SSL_Cipher:                Master_SSL_Key:         Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No                 Last_IO_Errno: 0                 Last_IO_Error:                Last_SQL_Errno: 0                Last_SQL_Error:   Replicate_Ignore_Server_Ids:              Master_Server_Id: 2 1 row in set (0.00 sec) 然后在server2上面再操作一遍,这样就可以实现mysql的实时同步了。可以在bbs数据库创建表,或者创建phpmyadmin数据库上创建表。然后到另一台mysql上查看是否多了一个新表。如果有实验成功~本文出自 “Linux系统架构” 博客,请务必保留此出处http://research.blog.51cto.com/2258479/828926... 全文

休闲 mysql复制 mysql集群 mysql热备份 mysql互为主备

2.MySQL源码安装

MySQL的安装方式有很多,源码安装可定制性比较强,你可以指定你要安装的文件位置,你需要编译的功能等等。2.1 解压并编译安装[root@MySQL-Master ~]# cd /usr/local/src[root@MySQL-Master src]# wget ... 全文

MySQL源码安装 MySQL安装 MySQL优化安装 mysql 数据库

5.MySQL Cluster(MySQL集群)

5.1 MySQL Cluster 简介请参考官方文档:http://dev.mysql.com/doc/refman/5.1/zh/ndbcluster.html 下面是官方的MySQL Cluster 的基本架构图:5.2 MySQL Cluster环境搭建搭建MySQL Cluster至少需要三个节点,一个管理节点来实现管理功能,一个SQL节点主机来实现MySQL server功能,一个ndb节点主机实现NDB Cluster的功能。  5.2.1  实验环境 主机名IP地址作用MySQL-SQL-Node1192.168.140.128SQL 节点服务器MySQL-Data-Node1192.168.140.129Data 节点服务器... 全文

MySQL Cluster 数据库 MySQL集群 mysql 休闲

3.MySQL Replication(MySQL 复制)

3.1 MySQL Replication 概述MySQL Replication俗称MySQL AB复制,主要是通过把主服务器上的二进制日志通过网络传到从服务器上,MYSQL会自己把二进制日志转换成相关的DDL,DML,DCL等语句!但这种复制不同于MySQL簇,它是单向异步的。目前MySQL 复制在企业应用率非常高,已经成为系统工程师必备的技能。具体的原理请参考MySQL官方文档:http://dev.mysql.com/doc/refman/5.1/zh/index.html3.2 安装MySQL Slave实验环境: 实验环境是沿用第二章实验基础上的: 主机名IP地址作用MySQL-Master192.168.0.13MySQL主库服务器MySQL-Slave... 全文

MySQL复制 mysql 数据库 MySQL AB复制 休闲

MySQL InnoDB存储引擎之锁

    概念:         锁是用来管理对共享文件的并发访问。innodb会在行级别上对数据库上锁。不过innodb存储引擎会在数据库内部其他多个地方使用锁,从而允许对不同资源提供并发访问。例如操作缓冲池中的LRU列表,删除,添加,移动LRU列表中的元素,为了保证一致性,必须有锁的介入。MyISAM引擎是表锁,而InnoDB提供一致性的非锁定读、行级锁,且行级锁没有相关额外的开销。     锁         table-level locking(表级锁)             整个表被客户锁定。根据锁定的类型,其他客户不能向表中插入记录,甚至从中读数据也受到限制MyISAM、MEMORY默认锁级别,个别时候,InnoDB也会升级为表级锁         row-level locking(行级锁)             只有线程当前使用的行被锁定,其他行对于其他线程都是可用的InnoDB默认行级锁。是基于索引数据结构来实现的,而不是像ORACLE的锁,是基于block的。InnoDB也会升级为表级锁,全表/全索引更新,请求autoinc锁等         page-level locking(页级锁)             锁定表中某些行集合(称做页),被锁定的行只对锁定最初的线程是可行。如果另外一个线程想要向这些行写数据,它必须等到锁被释放。不过其他页的行仍然可以使用BDB默认页级锁     lock与latch         latch称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。latch可以通过命令show engine innodb mutex来进行查看。如图:         由上图可以看出列Type显示的总是InnoDB,列Name显示latch的信息以及所在源码的行数,列Status中显示的os_waits表示操作系统等待的次数。         lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或者rollback后释放(不同事务隔离级别释放的时间可能不一样)。有死锁机制。二则的区别如下:             特点:     InnoDB是通过对索引上的索引项加锁来实现行锁。这种特点也就意味着,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。     锁的类型:         有两种标准的行级锁:             共享锁(S lock):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁.SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE             排它锁(X lock):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他锁.SELECT * FROM table_name WHERE ... FOR UPDATE         InnoDB存储引擎支持意向锁且设计比较简练,分为两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。(意向锁是InnoDB自动加的)             意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁.             意向独占锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁.         表级意向锁与行级锁的兼容情况如下图:                 锁的查看         在InnoDB1.0版本之前只能通过show engine innodb status(transactions行中查看) 或者 show full processlist来查看当前库中锁的请求。但是在这之后在information_schema架构下新增innodb_trx、innodb_locks和innodb_lock_waits三张表记录当前库中锁的情况。         三个表的字段说明如下图     一致性非锁定读(consistent nonlocking read)         一致性的非锁定读是指InnoDB存储引擎通过行多版本控制(multi_versioning)的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行delete或者update操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB存储引擎会去读取行的一个快照数据(当前行数据的历史版本)。快照数据是指该行的之前版本的数据,该实现是通过undo段来完成。而undo用来在事务回滚数据,因此快照数据本身是没有额外开销。而且,读取快照数据是不需要上锁的。一致性非锁定读是InnoDB存储引擎的默认读取方式(在读取不会占用和等待表上的锁)。但是在不同事务隔离级别下,读取的方式不同,并不是在每个事务隔离级别下都是采用非锁定的一致性读。即使都是使用非锁定的一致性读,但是对于快照数据的定义格式也各不相同。在事务隔离级别READ COMMITTED(RC)和REPEATABLE READ(RR,InnoDB存储引擎的默认事务隔离级别)下,InnoDB存储引擎使用非锁定的一致性读。然而,对于快照数据的定义去不相同。在RC事务隔离级别下,对于快照数据,非一致性读总是读取被锁定行的最新一份快照数据。而在RR事务隔离解绑下,对于快照数据,非一致性读总是读取事务开始时的行数据版本。     一致性锁定读         有上文知道,默认的事务隔离级别(RR)模式下,InnoDB存储引擎的select操作使用一致性非锁定读。但是在某些情况下,用户需要显式地对数据库读操作加锁以保证数据逻辑的一致性。InnoDB存储引擎对于select语句支持两种一致性的锁定读操作:             select ... for update:对读取的行记录加X锁,其他事物不能对该行加任何锁。             select ... lock in share mode:对读取的行记录加S锁,其他事物可以对该行加S锁,但是如果加X锁,则会被阻塞。     自增长与锁         在InnoDB存储引擎的内存结构中,对每个含有自增长值的表都有一个自增长计数器(auto-increment counter)。当对含有自增长的计数器的表进行插入操作是,这个计数器会被初始化,执行如下的语句来得到计数器的值:select max(auto_inc_col) from t for update。插入操作会依据这个自增长的计数器值加1赋予自增长列。这个实现方式称为AUTO-INC Locking,这是一种特殊的表锁机制,为了提高插入的性能,锁不是在一个事务完成之后才释放,而是在完成对自增长值插入的SQL语句后会立即释放。AUTO-INC Locking在一定程度上提高了并发插入的效率,但是还存在一些性能上的问题。首先,对于有自增长值的列的并发插入性能较差,事务必须等待前一个插入的完成(不用等待事务的完成)。其次,对于insert ... select的大数据量的插入会影响插入的性能,因为另一个事务中的插入会被阻塞。从MySQL5.1.22版本开始,InnoDB存储引擎提供了一种轻量级互斥量的自增长实现机制,这种机制大大提高了自增长值插入的性能。通过参数innodb_autoinc_lock_mode来控制自增长的模式(默认为1)。自增长的插入进行分类如图:         innodb_autoinc_lock_mode的参数值及其对自增长的影响如下图:         MyISAM存储引擎是表锁,自增长不用考虑并发插入的问题。需要注意的是:在InnoDB存储引擎中,自增长值的列必须是索引,同时必须是索引的第一个列,如果不是第一个列,MySQL是会抛出异常的。异常如图     外键与锁         外键主要用于完整性的约束检查。在InnoDB存储引擎中,对于一个外键列,如果没有显式地对这个列加索引,InnoDB存储引擎会自动对其加一个索引,避免表锁。对于外键值的插入或者更新,首先需要查询父表中的记录,对于父表的select操作,不是使用的一致性非锁定读的方式,因为这样会发生数据不一致的问题,所以这时使用的是select ... lock in share mode方式,即主动给父表加一个S锁。     锁的问题         dirty read 脏读             脏读就是读取到脏数据(未提交的数据)。一个事务(A)读取到另一个事务(B)中修改后但尚未提交的数据,并在这个数据的基础上操作。这时,如果B事务回滚,那么A事务读到的数据是无效的。不符合一致性。如图             首先事务的隔离级别有默认的RR改为RU,由上述例子可以看出会话B中两次select操作取得了不同的结果,并且这2条记录是会话A中并未提交的数据,这就产生了脏读。由此可以得出结论:脏读发生的条件是事务的隔离级别为RU。         unrepeatable read 不可重复读             事务(A)读取到了另一个事务(B)已经提交的更改数据,不符合隔离性。不可重复读和脏读的区别是:脏读是读到未提交的数据,而不可重复读则读到的是已经提交的数据。首先将事务隔离级别调整为RC,然后操作下边的例子:         phantom read 幻读             事务(A)读取到了另一个事务(B)提交的新增数据,不符合隔离性。     锁的范围(锁的算法):         1.Record Lock :单个记录上的锁,总是会去锁住索引记录,如果InnoDB存储引擎表在建立的时候没有设置任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。         2.Gap Lock:间隙锁,锁定一个范围,但不包含记录本身。         3.Next-key Lock: 锁定一个范围和本身 Record Lock + Gap Lock,防止幻读。         主键索引和唯一辅助索引 = record lock         非唯一辅助索引 = next-key lock     阻塞         不同锁之间的兼容性关系,在有些时刻一个事务中的锁需要等待另外一个事务中的锁释放它所占用的资源,这就是阻塞。阻塞并不是一件坏事,其是为了确保事务可以并发且正常地运行。在InnoDB存储引擎中,参数innodb_lock_wait_timeout用来动态的控制等待的时间(默认50秒),innodb_rollback_on_timeout用来静态的设定释放在等待超时时对进行的事务进行回滚操作(默认OFF,代表不回滚)。     死锁        死锁是指两个或者两个以上的事务在执行过程中,因争夺资源而造成的一种相互等待的现象。解决死锁最简单的一种方式是超时,即当两个事务相互等待是,当一个等待时间超过设置的某一阀值时,其中一个事务进行回滚,另外一个等待的事务就能继续进行。在InnoDB存储引擎中,参数innodb_lock_wait_timeout用来设置超时时间。但若超时的事务所占权重比较大,如果事务操作更新了很多行,占用了较多的undo log,这时采用FIFO的方式就不合适啦,因为回滚这个事务的时间相对于另一个事务所占用的时间可能会很多。因此,除了超时机制,当前数据库都普遍采用wait-for graph(等待图)的方式来进行死锁检测。要求数据库报错以下两种信息:a.锁的信息链表;b.事务等待链表。通过上述链表可以构造一张图,而在这个图中若存在回路,就代表存在死锁。在wait-for graph中,事务为图中的节点。如图:... 全文

Mysql InnoDB锁 Mysql InnoDB存储引擎锁 Mysql InnoDB Mysql 锁

Mysql Replication系列之原理及配置

        mysql的复制(replication)是一个异步的复制从一个mysql instace(master)复制到另一个mysql instace(slave)。实现整个复制操作主要有三个线程完成的,其中两个线程在slave(SQL_thread和IO_thread),另外一个线程在master(IO_thread)上。        Replication的原理如图所示:               具体步骤:... 全文

Mysql Replication Mysql主从复制 Mysql复制原理 Mysql 复制步骤

MySQL性能优化之一:提高MySQL并发能力的思路

1、使用行级别锁,避免表级别或页级别锁尽量使用支持行级别锁的存储引擎,如InnoDB;只在读操作显著多于写作的场景中(如数据仓库类的应用)使用表级别锁的存储引擎,如MyISAM;。 2、降低热巨锁(hot gaint lock)出现的可能性以尽可能避免全局互斥量 临界区(仅允许单一线程访问的资源)会严重降低MySQL系统并发性;InnoDB缓冲池(buffer pool)、数据字典等都是常见的临界区;幸运的是,新版本的InnoDB已经能够较好的运行于多核处理器,支持使用innodb_buffer_pool_instances服务器变量建立多个缓冲池实例,每个缓冲池实例分别自我管理空闲列表、列表刷写、LRU以及其它跟缓冲池相关的数据结构,并通过各自的互斥锁进行保护。3、并行运行多个I/O线程 通过innodb_io_capacity服务器变量等增加磁盘I/O线程的数量可以提高前端操作(如SELECT)的性能,不过,磁盘I/O线程的数量不应该超过磁盘的IOPS(7200RPM的单块硬件的IOPS数量一般为100个左右)。 此外,异步I/O也可以在一定程度上提高系统的并发能力,在Linux系统上,可以通过将MySQL的服务器变量innodb_use_native_aio的值设定为ON设定InnoDB可以使用Linux的异步I/O子系统。4、并行后端任务 默认情况下,MySQL的清写(purge)操作(用于移除带删除标记的记录)由InnoDB的主线程完成,这可以降低内部资源竞争发生的概率,进而增强MySQL服务伸缩能力。不过,随着InnoDB内部各式各样的竞争越来越多,这种设置带来的性能优势已几乎不值一提,因此,生产环境中应该通过为innodb_purge_threads服务器变量设定为ON将主线程与清写线程分开运行。5、单线程复制模型中的SQL线程是一个热区 在从服务器上并行运行多个SQL线程可有效提高MySQL从服务器性能,MySQL 5.6支持多线程复制(每库一个复制线程);本文出自 “马哥教育Linux运维培训” 博客,转载请与作者联系!... 全文

mysql优化 马哥教育 mysql性能 mysql并发

详解MySQL与客户机的连接(1)

本文通过演示如何使用mysql客户程序与数据库服务器连接。mysql(有时称为“终端监视器”或只是“监视”)是一个交互式程序,允许你连接一个MySQL服务器,运行查询并察看结果。mysql可以用于批模式:你预先把查询放在一个文件中,然后告诉mysql执行文件的内容。使用mysql的两个方法都在这里涉及。为了看清由mysql提供的一个选择项目表了,用--help选项调用它:shell> mysql --help... 全文

MySQL连接 MySQL命令 MySQL Shell MySQL 客户机

MySQL读写分离及MMM高可用架构测试

架构组件简介MySQL-Proxy简介MySQL-Proxy是处在你的MySQL数据库客户和服务端之间的程序,它还支持嵌入性脚本语言Lua。这个代理可以用来分析、监控和变换(transform)通信数据,它支持非常广泛的使用场景:负载平衡和故障转移处理查询分析和日志SQL宏(SQL macros)查询重写(query rewriting)执行shell命令... 全文

mysql mysql mmm HA mysql-proxy mysql主从

MySQL服务器学习笔记!(四) ——备份/恢复

 这是一步步从头学习MySQL的笔记历程,本人在学习之前只接触过少量SQL Server。... 全文

mysql备份 mysql还原 mysql mysql数据库 数据库

mysql5.6下主主复制的配置实现

两台虚拟机192.168.183.131和192.168.183.132,装完系统之后直接把所有开发包都装上 下载软件包mysql-5.6.10.tar.gz,cmake-2.8.10.2.tar.gz(从5.5开始mysql使用cmake来进行编译了而不是之前的configure)mysql的编译安装1.首先安装cmake... 全文

mysql5.6编译安装 mysql5.6主从复制 mysql5.6主主复制 mysql AB复制

MySQL数据库的优化(上)单机MySQL数据库的优化

{51CTO独家特稿}公司网站访问量越来越大, MySQL 的压力越来越大了,第一步自然想到的是 MySQL 系统参数的优化,我们不可能指望 MySQL 默认的系统参数能够让 MySQL运行得非常顺畅。在Apache(Nginx)、PHP、 MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知 识,同时还需要长时间的观察统计并且根据经验 进行判断,然后设置合理的参数。 下面我们了解一下MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是MySQL安装时的编译优化,三 是自身配置文件my.cnf的优化;如果单机的优化也解决不了你的数据库的压力的话,那这个时候就只有考虑采用集群架构的方法,这个我在后面也会重点说 明。单机MySQL数据库的优化 一、服务器硬件对MySQL性能的影响 ①磁盘寻道能力(磁盘I/O),我们现在上的都是SAS15000转的硬盘。MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。所 以,通常认为磁盘I/O是制约MySQL性能的最大因素之一,对于日均访 问量在100万PV以上的Discuz!论坛,由于磁盘I/O的制约,MySQL的性能会非常低下!解决这一制约因素可以考虑以下几种解决方案: 使用RAID1+0磁盘阵列,注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快。 ②CPU 对于MySQL应用,推荐使用DELL R710,E5620 @2.40GHz(4 core)* 2 ,我现在比较喜欢DELL R710,也在用其作Linuxakg 虚拟化应用; ③物理内存对于一台使用MySQL的Database Server来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存,不过内存对于现在的服务器而言可以说是一个可以忽略的问题,工作中遇到高端服务器基本上内存都超过了32G。 我们工作中用得比较多的数据库服务器是HP DL580G5和DELL R710,稳定性和性能都不错;特别是DELL R710,我发现许多同行都是采用它作数据库的服务器,所以重点推荐下。 二、MySQL的线上安装我建议采取编译安装的方法,这样性能上有较大提升,服务器系统我建议用64bit的Centos5.5,源码包的编译参数会默认 以Debgu模式生成二进制代码,而Debug模式给MySQL带来的性能损失是比较大的,所以当我们编译准备安装的产品代码时,一定不要忘记使用“— without-debug”参数禁用Debug模式。而如果把—with-mysqld-ldflags和—with-client-ldflags二 个编译参数设置为—all-static的话,可以告诉编译器以静态方式编译和编译结果代码得到最高的性能。使用静态编译和使用动态编译的代码相比,性能 差距可能会达到5%至10%之多。我参考了简朝阳先生的编译参数,特列如下,供大家参考 ./configure –prefix=/usr/local/mysql –without-debug –without-bench –enable-thread-safe-client –enable-assembler –enable-profiling –with-mysqld-ldflags=-all-static –with-client-ldflags=-all-static –with-charset=latin1 –with-extra-charset=utf8,gbk –with-innodb –with-csv-storage-engine –with-federated-storage-engine –with-mysqld-user=mysql –without-embedded-server –with-server-suffix=-community –with-unix-socket-path=/usr/local/mysql/sock/mysql.sock 三、MySQL自身因素当解决了上述服务器硬件制约因素后,让我们看看MySQL自身的优化是如何操作的。对 MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。 下面,我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明: #vim /etc/my.cnf 以下只列出my.cnf文件中[mysqld]段落中的内容,其他段落内容对MySQL运行性能影响甚微,因而姑且忽略。 [mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-locking #避免MySQL的外部锁定,减少出错几率增强稳定性。 skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求! back_log = 384 #back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自 己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。 key_buffer_size = 384M #key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。注意:该参数值设置的过大反而会是服务器整体效率降低! max_allowed_packet = 4M thread_stack = 256K table_cache = 614K sort_buffer_size = 6M #查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。 read_buffer_size = 4M #读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。 join_buffer_size = 8M #联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。 myisam_sort_buffer_size = 64M table_cache = 512 thread_cache_size = 64 query_cache_size = 64M #指定MySQL查询缓冲区的大小。可以通过在MySQL控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够 的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓 冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。 tmp_table_size = 256M max_connections = 768 #指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。 max_connect_errors = 1000 wait_timeout = 10 #指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。 thread_concurrency = 8 #该参数取值为服务器逻辑CPU数量*2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4*2=8;这个目前也是双四核主流服务器配置。 skip-networking #开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接! table_cache=1024   #物理内存越大,设置就越大.默认为2402,调到512-1024最佳 innodb_additional_mem_pool_size=4M #默认为2M innodb_flush_log_at_trx_commit=1 #设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1 innodb_log_buffer_size=2M             #默认为1M innodb_thread_concurrency=8         #你的服务器CPU有几个就设置为几,建议用默认一般为8 key_buffer_size=256M                      #默认为218,调到128最佳 tmp_table_size=64M                        #默认为16M,调到64-256最挂 read_buffer_size=4M                      #默认为64K read_rnd_buffer_size=16M             #默认为256K sort_buffer_size=32M                    #默认为256K thread_cache_size=120              #默认为60 query_cache_size=32M  ※值得注意的是: 很多情况需要具体情况具体分析 一、如果Key_reads太大,则应该把my.cnf中Key_buffer_size变大,保持Key_reads/Key_read_requests至少1/100以上,越小越好。 二、如果Qcache_lowmem_prunes很大,就要增加Query_cache_size的值。 很多时候我们发现,通过参数设置进行性能优化所带来的性能提升,可能并不如许多人想象的那样产生质的飞跃,除非是之前的设置存在严重不合理的情况。我们不能将性能调优完全依托于通过DBA在数据库上线后进行的参数调整,而应该在系统设计和开发阶段就尽可能减少性能问题。本文出自 “抚琴煮酒之博” 博客,请务必保留此出处http://andrewyu.blog.51cto.com/1604432/509635... 全文

mysql MySQL数据库的优化(上)单机MySQL数据库的优化 数据库 休闲 职场

优化mysql的性能,详细介绍Mysql的配置my.cnf的参数

[mysqld]port      = 3306serverid  = 1socket    = /tmp/mysql.sockskip-locking      # 避免MySQL的外部锁定,减少出错几率增强稳定性。skip-networking   # 开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接! skip-name-resolve # 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!back_log = 384 ########### 我的1G内存没有设置此项使用的默认值 50,目前观察还不错。# 1. 指定MySQL可能的连接数量,当MySQL主线程在很短的时间内接收到非常多的连接请求,该参数生效,主线程花费很短的时间检查连接并且启动一个新线程。# 2. back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。# 3. 注意:试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。key_buffer_size  = 256M ########### 我设置的128M,目前观察还不错。# 只对MyISAM表起作用,指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。尤其是索引读的速度。# 1. 对于内存在4GB左右的服务器该参数可设置为256M或384M。# 2. 另外一个估计key_buffer_size的办法 把你网站数据库的每个表的索引所占空间大小加起来看看, 以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大.# 3. 一般我们设为16M,实际上稍微大一点的站点 这个数字是远远不够的,通过检查状态值 Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例 key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。以下的状态值都是本人(hexu.org)通过 Sqlyog 获得的实例分析:    #> SHOW STATUS LIKE 'key_read%'    ##> key_read_requests – 650759289    ##> key_reads - 79112    ##> 比例接近1:8000 健康状况非常好# 4. 注意:该参数值设置的过大反而会是服务器整体效率降低! query_cache_type  = 1 # 指定是否使用查询缓冲query_cache_limit = 2Mquery_cache_size  = 64M  ########### 我的1G内存设置为64M,目前观察还不错。# 使用查询缓冲,MySQL将Select语句和查询结果存放在缓冲区中,今后对于同样的Select语句(区分大小写),将直接从缓冲区中读取结果。# 1. 根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。 指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察:    #> SHOW VARIABLES LIKE '%query_cache%';    #> SHOW STATUS LIKE 'Qcache%';    # 1. 如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小    # 2. 如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在Select语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。    # 3. 如果Qcache_free_blocks的值非常大,则表明缓冲区中碎片很多max_allowed_packet = 4Mthread_stack       = 256Ktable_cache        = 256 ########### 我的1G内存设置为256,目前观察还不错。# 指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。# 1. 对于有1G内存的机器,推荐值是128-256。# 2. 通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。# 3. 如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了。    #> SHOW STATUS LIKE ’Open%tables‘;    # 1. Open tables 256    # 2. Opened tables 9046    # 虽然open_tables已经等于table_cache,但是相对于服务器运行时间来说,已经运行了20 天,opened_tables的值也非常低。因此,增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache# 4. 注意:不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。sort_buffer_size   = 6M # 查询排序时所能使用的缓冲区大小。read_buffer_size   = 4M # 读查询操作所能使用的缓冲区大小。join_buffer_size   = 8M # 联合查询操作所能使用的缓冲区大小# 注意:sort/read/join_buffer_size 三个参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。myisam_sort_buffer_size = 64Mtable_cache             = 512tmp_table_size     = 256Mmax_connections    = 768# 指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。max_connect_errors = 10000000wait_timeout       = 10# 指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。thread_cache         32# 没找到具体说明,不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的 thread_concurrency = 8# 该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 = 8thread_cache_size  = 8# 默认是 8 ,这个值表示可以重新利用保存在缓存中线程的数量, 当断开连接时:# 1. 如果缓存中还有空间,那么客户端的线程将被放到缓存中,# 2. 如果线程重新被请求,那么请求将从缓存中读取,# 3. 如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,# 4. 如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。# 5. 根据物理内存设置规则如下:    # Mem: 1G  可以设置为 8    # Mem: 2G  可以设置为 16    # Mem: 3G  可以设置为 32    # Mem: >3G 可以设置为 64 ft_min_word_len = 4 ########### 我的设置为2#被全文检索索引的最小的字长. 你也许希望减少它,如果你需要搜索更短字的时候. 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引 log-bin  = /home/mysql/logs/binlog/mysql-bin# 如果你不需要记录2进制log 就把这个功能关掉,注意关掉以后就不能恢复出问题前的数据了,需要您手动备份,# 1. 二进制日志包含所有更新数据的语句,其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。# 2. 另外,如果做同步复制( Replication )的话,也需要使用二进制日志传送修改情况。# 3. 如果不提供文件名,MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引,每次启动服务时,都会重新生成一个新的二进制文件。# 4. 此外说明:    # 1. 使用log-bin-index可以指定索引文件;    # 2. 使用binlog-do-db可以指定记录的数据库;    # 3. 使用binlog-ignore- db可以指定不记录的数据库。    # 注意第一:binlog-do-db和binlog-ignore-db一次只指定一个数据库,指定多个数据库需要多个语句。    # 注意第二:MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。log_slow_queries = /home/mysql/logs/slowlog/slow.query# 指定日志文件,如果不提供文件名,MySQL将自己产生缺省文件名。long_query_time  = 2 ########### 我设置的如果查询时间大于 2s,就记录慢查询到log_slow_querys指的文件中log_long_format# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里log-queries-not-using-indexes# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里skip-innodb  #去掉innodb支持 本文出自 “起点安全” 博客,请务必保留此出处http://lovevickie.blog.51cto.com/1576116/457718... 全文

优化mysql的性能 mysql 数据库 详细介绍Mysql的配置my.cnf的参数 休闲

MySQL数据库的优化(下)MySQL数据库的高可用架构方案

51CTO独家特稿】如果单MySQL的优化始终还是顶不住压力时,这个时候我们就必须考虑MySQL的高可用架构(很多同学也爱说成是MySQL集群)了,目前可行的方案有:一、MySQL Cluster优势:可用性非常高,性能非常好。每份数据至少可在不同主机存一份拷贝,且冗余数据拷贝实时同步。但它的维护非常复杂,存在部分Bug,目前还不适合比较核心的线上系统,所以这个我不推荐。二、DRBD磁盘网络镜像方案... 全文

MySQL数据库的优化(下)MySQL数据库的高可用架构方案 mysql 数据库 休闲 职场

2 3 4 5 6 7 8 9 10 11