环境 配置Mysql的MasterSlave至少需要两台机器。我这里使用三台虚拟机进行测试。三台机器配置完全一样,MySQL安装的路径也是一样: 第一台:10.1.5.181; Windows 2008 DataCenter + MySQL Community Server 5.6.10.1 第二台:10.1.5.182; Windows 2008 DataCenter + MySQL Community Server 5.6.10.1 第三台:10.1.5.183; Windows 2008 DataCenter + MySQL Community Server 5.6.10.1 第一台10.1.5.181用作master,其他两台用做slave。 配置Master 在10.1.5.181这台服务器上找到MySQL的配置文件my.ini。我的具体路径是在C:\ProgramData\MySQL\MySQL Server 5.6下。 打开配置文件,在最下面添加如下配置: ************************************************************************************ #Master start #日志输出地址 主要同步使用 log-bin=master-bin.log #同步数据库 binlog-do-db=test #主机id 不能和从机id重复 server-id=1 #Master end ************************************************************************************ master的配置比较少,server-id是为这一组master/slave服务器定的唯一id,master/slave服务器中不能重复。在binlog-do-db中填写对象要同步的数据库,如果有多个,用逗号分隔,或再写一行如binlog-do-db=test2。 配置Slave 同样在第二台机器上10.1.5.181找到配置文件my.ini。打开配置文件,在最下面添加如下配置: ***************************************************************************** report-host = 10.1.5.181 report-user = root report-password = root123 log-bin = slave-bin.log replicate-do-db = test server-id = 2 ***************************************************************************** 这里需要添加master的IP,连接master的用户名和密码,生产环境中需要新建一个用户专门来处理replication,这里没有新建用户,用root做测试。端口没有配置,就是使用默认的3306,如果端口有变化,则通过report-port=?来配置。log-bin是记录日志的位置。 然后通过命令start slave来启动mysql的复制功能。如果在start slave过程中出现异常: The server is not configured as slave; fix in config […]
View Details获得当前日期+时间(date + time)函数:now()
1 2 3 4 5 6 7 |
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2008-08-08 22:20:46 | +---------------------+ |
获得当前日期+时间(date + time)函数:sysdate() sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:
1 2 3 4 5 6 7 |
mysql> select now(), sleep(3), now(); +---------------------+----------+---------------------+ | now() | sleep(3) | now() | +---------------------+----------+---------------------+ | 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 | +---------------------+----------+---------------------+ |
sysdate() 日期时间函数,一般情况下很少用到。 MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()
1 2 3 4 5 6 7 |
mysql> select current_timestamp, current_timestamp(); +---------------------+---------------------+ | current_timestamp | current_timestamp() | +---------------------+---------------------+ | 2008-08-09 23:22:24 | 2008-08-09 23:22:24 | +---------------------+---------------------+ |
MySQL 日期转换函数、时间转换函数 MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)
1 2 3 4 5 6 7 |
mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s'); +----------------------------------------------------+ | date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') | +----------------------------------------------------+ | 20080808222301 | +----------------------------------------------------+ |
MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。 MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)
1 2 3 4 5 |
select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09 select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09 select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09 select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30 select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30 |
可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。 MySQL (日期、天数)转换函数:to_days(date), from_days(days)
1 2 |
select to_days('0000-00-00'); -- 0 select to_days('2008-08-08'); -- 733627 |
MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)
1 2 |
select time_to_sec('01:00:05'); -- 3605 select sec_to_time(3605); -- '01:00:05' |
MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)
1 2 3 |
select makedate(2001,31); -- '2001-01-31' select makedate(2001,32); -- '2001-02-01' select maketime(12,15,30); -- '12:15:30' |
MySQL (Unix 时间戳、日期)转换函数
1 2 3 4 |
unix_timestamp(), unix_timestamp(date), from_unixtime(unix_timestamp), from_unixtime(unix_timestamp,format) |
下面是示例:
1 2 3 4 5 6 7 8 9 |
select unix_timestamp(); -- 1218290027 select unix_timestamp('2008-08-08'); -- 1218124800 select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800 select from_unixtime(1218290027); -- '2008-08-09 21:53:47' select from_unixtime(1218124800); -- '2008-08-08 00:00:00' select from_unixtime(1218169800); -- '2008-08-08 12:30:00' select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008' |
MySQL 日期时间计算函数 MySQL 为日期增加一个时间间隔:date_add()
1 2 3 4 5 6 7 8 9 10 11 12 13 |
set @dt = now(); select date_add(@dt, interval 1 day); -- add 1 day select date_add(@dt, interval 1 hour); -- add 1 hour select date_add(@dt, interval 1 minute); -- ... select date_add(@dt, interval 1 second); select date_add(@dt, interval 1 microsecond); select date_add(@dt, interval 1 week); select date_add(@dt, interval 1 month); select date_add(@dt, interval 1 quarter); select date_add(@dt, interval 1 year); select date_add(@dt, interval -1 day); -- sub 1 day |
MySQL adddate(), addtime()函数,可以用 date_add() 来替代。下面是 date_add() 实现 […]
View Details网站:bbs.osyunwei.com 程序在:Web服务器192.168.21.129上面 数据库在:MySQL服务器192.168.21.169上面 实现目的:增加一台MySQL备份服务器(192.168.21.168),做为MySQL服务器(192.168.21.169)的从服务器,这两台MySQL服务器之间实现双机热备。 即:从服务器(192.168.21.168)上面指定的数据库永远与主服务器(192.168.21.169)上面指定的数据库保持同步,并且随着主服务器(192.168.21.169)上面指定的数据库的变化而变化。 系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容版权所有,转载请注明出处及原文链接 环境说明 1、Web服务器 系统:CentOS 6.2 IP:192.168.21.129 Web环境:apache+php 2、MySQL主服务器 系统:CentOS 6.2 IP:192.168.21.169 主机名称:MySQLMaster MySQL版本:mysql-5.5.22 3、MySQL从服务器 系统:CentOS 6.2 IP:192.168.21.168 主机名称:MySQLSlave MySQL版本:mysql-5.5.22 4、客户机 系统:Windows 7 IP:192.168.21.130 备注:作为主从服务器的MySQL版本建议使用同一版本!或者必须保证主服务器的MySQL版本要高于从服务器的MySQL版本(MySQL版本是向下兼容的) ####################################################################################### 教程开始: 一、安装MySQL 说明:在两台MySQL服务器192.168.21.169和192.168.21.168上分别进行如下操作,安装MySQL 5.5.22 1、配置防火墙,开启MySQL默认3306端口 vi /etc/sysconfig/iptables #编辑防火墙配置文件 -A INPUT -m state state NEW -m tcp -p tcp dport 3306 -j ACCEPT /etc/init.d/iptables restart #重启防火墙,使配置生效 2、关闭SELINUX vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled #增加 :wq 保存,关闭。 shutdown -r now重启系统。 3、安装编译工具 yum install wget make apr* autoconf automake curl-devel gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel gd kernel […]
View Details前言:朋友咨询我说执行简单的update语句失效,症状如下: MySQL> update order_info set province_id=15 ,city_id= 1667 where order_from=10 and order_out_sn= 1407261241xxxx ; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction mysql> QQ远程过去,开始check 1,查看数据库的隔离级别: mysql> select @@tx_isolation; + + | @@tx_isolation | + + | REPEATABLE-READ | + + 1 row in set (0.00 sec) mysql> 2,去查看先当前库的线程情况: mysql> show full processlist; + -+ + -+ + -+ + -+ + | Id | User | Host | db | Command | Time | State | Info | + -+ + -+ + -+ + -+ + | 1 | event_scheduler | localhost | NULL | Daemon | 9635385 | Waiting on empty queue | NULL | | 9930577 | business_web | 192.168.1.21:45503 | business_db | Sleep | […]
View Details闲置已久的空间环境配置忘得差不多了,今天得空整理,重置了磁盘重新搭建环境,首先在CentOS 7.0安装MariaDB的数据库,在这里记录下安装过程,以便以后查看。 1、安装MariaDB 安装命令
1 |
yum -y install mariadb mariadb-server |
安装完成MariaDB,首先启动MariaDB
1 |
systemctl start mariadb |
设置开机启动
1 |
systemctl enable mariadb |
接下来进行MariaDB的相关简单配置
1 |
mysql_secure_installation |
首先是设置密码,会提示先输入密码 Enter current password for root (enter for none):<–初次运行直接回车 设置密码 Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车 New password: <– 设置root用户的密码 Re-enter new password: <– 再输入一次你设置的密码 其他配置 Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车 Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车, Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车 Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车 初始化MariaDB完成,接下来测试登录
1 |
mysql -uroot -ppassword |
完成。 2、配置MariaDB的字符集 文件/etc/my.cnf
1 |
vi /etc/my.cnf |
在[mysqld]标签下添加
1 2 3 4 5 |
init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake |
文件/etc/my.cnf.d/client.cnf
1 |
vi /etc/my.cnf.d/client.cnf |
在[client]中添加
1 |
default-character-set=utf8 |
文件/etc/my.cnf.d/mysql-clients.cnf
1 |
vi /etc/my.cnf.d/mysql-clients.cnf |
在[mysql]中添加
1 |
default-character-set=utf8 |
全部配置完成,重启mariadb
1 |
systemctl restart mariadb |
之后进入MariaDB查看字符集
1 |
mysql> show variables like "%character%";show variables like "%collation%"; |
显示为 +————————--+—————————-+ | Variable_name […]
View Details定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔。 语法
1 |
DATE_ADD(date,INTERVAL expr type) |
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。 type 参数可以是下列值: Type 值 MICROSECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND HOUR_MINUTE DAY_MICROSECOND DAY_SECOND DAY_MINUTE DAY_HOUR YEAR_MONTH 实例 假设我们有如下的表: OrderId ProductName OrderDate 1 'Computer' 2008-12-29 16:25:46.635 现在,我们希望向 "OrderDate" 添加 2 天,这样就可以找到付款日期。 我们使用下面的 SELECT 语句:
1 2 |
SELECT OrderId,<code>DATE_ADD(OrderDate,INTERVAL 2 DAY)</code> AS OrderPayDate FROM Orders |
结果: OrderId OrderPayDate 1 2008-12-31 16:25:46.635 from:http://www.w3school.com.cn/sql/func_date_add.asp
View Details1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server 创建 备份数据的 device USE master EXEC sp_addumpdevice disk , testBack , c:\mssql7backup\MyNwind_1.dat 开始 备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键: Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index […]
View Details★预备知识 1.双机热备 对于双机热备这一概念,我搜索了很多资料,最后,还是按照大多数资料所讲分成广义与狭义两种意义来说。 从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务。 从狭义上讲,双机热备就是使用互为备份的两台服务器共同执行同一服务,其中一台主机为工作机(Primary Server),另一台主机为备份主机(Standby Server)。在系统正常情况下,工作机为应用系统提供服务,备份机监视工作机的运行情况(一般是通过心跳诊断,工作机同时也在检测备份机是否正常),当工作机出现异常,不能支持应用系统运营时,备份机主动接管工作机的工作,继续支持关键应用服务,保证系统不间断的运行。双机热备针对的是IT核心服务器、存储、网络路由交换的故障的高可用性解决方案。 2.为什么要进行双机热备? 双机热备服务针对的是服务器的故障。服务器的故障可能由各种原因引起,如设备故障、操作系统故障、软件系统故障等等。一般地讲,在技术人员在现场的情况下,恢复服务器正常可能需要10分钟、几小时甚至几天。从实际经验上看,除非是简单地重启服务器(可能隐患仍然存在),否则往往需要几个小时以上。而如果技术人员不在现场,则恢复服务的时间就更长了。 而对于一些重要系统而言,用户是很难忍受这样长时间的服务中断的。因此,就需要通过双机热备服务,来避免长时间的服务中断,保证系统长期、可靠的服务。 当然,决定是否使用双机热备,正确的方法是要分析一下系统的重要性以及对服务中断的容忍程度,以些决定是否使用双机热备。换句话说,就是你的用户能容忍多长时间恢复服务,如果服务不能恢复会造成多大的影响。 在考虑双机热备时,需要注意,一般意义上的双机热备都会有一个切换过程,这个切换过程可能是一分钟左右。在切换过程中,服务是有可能短时间中断的。但是,当切换完成后,服务将正常恢复。因此,双机热备不是无缝、不中断的,但它能够保证在出现系统故障时,能够很快恢复正常的服务,业务不致受到影响。而如果没有双机热备,则一旦出现服务器故障,可能会出现几个小时的服务中断,对业务的影响就可能会造成很严重的损失。 3.双机热备技术与备份的概念区别 热备份指的是:High Available(HA)即高可用,而备份指的是Backup,即数据备份的一种,这是两种不同的概念,应对的产品也是两种功能上完全不同的产品。热备份主要保障业务的连续性,实现的方法是故障点的转移。而备份,主要目的是为了防止数据丢失,而做的一份拷贝,所以备份强调的是数据恢复而不是应用的故障转移。 4.双机热备方案的主要两种组建方式 双机热备方案在进行讨论的时候一定要考虑到很多的因素,其中在各种环境下应用的时候需要格外的引起注意。当然还是有主要的两方式可以借鉴考虑的。 第一种,双机热备它的工作原理是使用两台服务器,一台作为主服务器(Active),运行应用系统来提供服务。另一台作为备机,安装完全一样的应用系统,但处于待机状态(Standby)。当Active服务器出现故障时,通过软件诊测将Standby机器激活,保证应用在短时间内完成恢复正常使用。 第二种,双机互备方式则是在双机热备的基础上,两个相对独立的应用在两台机器同时运行,但彼此均设为备机,当某一台服务器出现故障时,另一台服务器可以在短时间内将故障服务器的应用接管过来,从而保证了应用的持续性,这种方式实际上是双机热备方案的一种应用。 但目前使用最多的还是主从模式的双机热备方案。其大致表示可如下图所示: 目前基于存储共享的双机热备是双机热备方案的最标准方案。对于这种方式,采用两台服务器,使用共享的存储设备(磁盘阵列柜或存储区域网SAN)。两台服务器可以采用主从、互备等不同的方式。在工作过程中,两台服务器将以下一个虚拟的IP地址对外提供服务,依工作方式的不同,将服务请求发送给其中一台服务器承担。同时,服务器通过心跳线(目前往往采用建立私有网络的方式)侦测另一台服务器的工作状况。 下图即为双机热备工作大致状况图,如下图所示: 双机热备方案当一台服务器出现故障时,另一台服务器根据心跳侦测的情况做出判断,并进行切换,接管服务。对于用户而言,这一过程是全自动的,在很短时间内完成,从而不会对业务造成大的影响。由于使用共享的存储设备,因此两台服务器使用的实际上是一样的数据,由双机或集群软件对其进行管理。 5.Mysql双机热备实现原理图 有了上面对双机热备知识的讲解,对其实现原理就有了一个深入了解,那么我们要做mysql数据库的双机热备就清楚明了多了。 Mysql双机热备系统的拓扑结构如下图所示: 两台服务器通过以太网连接网络,通过网络对外提供服务、相互通信。 两台服务器之间用com口直接互联,双机热备软件利用这个连接进行双机热备相关的通信、监控和控制等。 两台服务器通过HBA卡连接FC网络,访问共同的磁盘阵列,实现双机热备系统必要的磁盘。 6.Mysql双机热备实现的配置 为了数据的安全,客户有两台机器作为互相备份,当一台机器出现故障时,自动切换到另一台服务器。大部分的软件是通过LifeKeeper来实现的,但是Mysql的双机备份在LifeKeeper里没有实现,所以只能自己手动来实现Mysql的双机备份了。 其实,Mysql的双机备份有一个很简单的第三方软件可以实现,那就是SQLyog,他有一个功能叫sja(SQLyog Job Agent)可以轻松实现,但是却有一个不足之处,就是Mysql表里必须有一个primary key,即主键值,如果没有,则此表不能用sja来实现。 第二种方法就是用Mysql自身的Replication机制来实现了。但是这个功能只有Mysql 3.23以上的版本才有。 这里先说明下,由于我还没有通过实际的应用例子来检测这种双机热备方式是否能过通过,所以我会在我通过实例实现后在续写我后面的关于Mysql双机热备实现的配置部分。现在这部分内容主要讲的还是双机热备份的实现原理和意义。 ★mysql双机热备的实现 接续上一篇关于mysql双机热备实现原理分析,在本文经过深思熟虑和多次用不同的方式实测试后。最后在这篇文章中,用一个小例子来完成mysql双机热备的实现。 Mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份的数据库中。实现mysql数据库的热备份。 要想实现双机的热备,首先要了解主从数据库服务器的版本的需求。要实现热备mysql的版本都高于3.2。还有一个基本的原则就是作为从数据库的数据版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。 当然要实现mysql双机热备,除了mysql本身自带的REPLICATION功能可以实现外,也可以用Heartbeat这个开源软件来实现。不过本文主要还是讲如何用mysql自带的REPLICATION来实现mysql双机热备的功能。 1. 准备服务器 由于Mysql不同版本之间的(二进制日志)binlog格式可能会不太一样,因此最好的搭配组合是主(Master)服务器的Mysql版本和从(Slave)服务器版本相同或者更低,主服务器的版本肯定不能高于从服务器版本。 本次我用于测试的两台服务器版本都是Mysql-5.5.17。 2. Mysql 建立主-从服务器双机热备配置步骤 2.1环境描述 A服务器(主服务器Master):59.151.15.36 B服务器(从服务器Slave):218.206.70.146 主从服务器的Mysql版本皆为5.5.17 Linux环境下 将主服务器需要同步的数据库内容进行备份一份,上传到从服务器上,保证始初时两服务器中数据库内容一致。 不过这里说明下,由于我是利用Mysql在安装后就有的数据库test进行测试的,所以两台服务器里面是没有建立表的,只不分别在test里面建立了同样的一张空表tb_mobile; Sql语句如下: mysql> create table tb_mobile( mobile VARCHAR(20) comment 手机号码 , time timestamp DEFAULT now() comment 时间 ); 2.2 主服务器Master配置 2.2.1 创建同步用户 进入mysql操作界面,在主服务器上为从服务器建立一个连接帐户,该帐户必须授予REPLICATION SLAVE权限。因为从mysql版本3.2以后就可以通过REPLICATION对其进行双机热备的功能操作。 操作指令如下: mysql> grant replication slave on *.* to replicate @ 218.206.70.146 […]
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
CREATE PROCEDURE `test`.`new_procedure` () BEGIN -- 需要定义接收游标数据的变量 DECLARE a CHAR(16); -- 游标 DECLARE cur CURSOR FOR SELECT i FROM test.t; -- 遍历数据结束标志 DECLARE done INT DEFAULT FALSE; -- 将结束标志绑定到游标 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 打开游标 OPEN cur; -- 开始循环 read_loop: LOOP -- 提取游标里的数据,这里只有一个,多个的话也一样; FETCH cur INTO a; -- 声明结束的时候 IF done THEN LEAVE read_loop; END IF; -- 这里做你想做的循环的事件 INSERT INTO test.t VALUES (a); END LOOP; -- 关闭游标 CLOSE cur; END |
这里有一个比较坑的地方,注意,变量的定义不要和你的select的列的键同名!不然,fetch into 会失败! 另外 : 如果没有则插入数据,如果有则更新的方法: insert into test values (a,b) ON DUPLICATE KEY UPDATE a=c; from:https://www.cnblogs.com/trying/p/3296793.html
View DetailsDROP PROCEDURE IF EXISTS proc_name; delimiter // create definer=root@localhost procedure proc_name( in pi_id int ) begin todo…… end// delimiter ;
View Details