MySQL 生成给定范围随机数

MySQL 的 rand() 函数是随机生成区间为 [0,1) 的浮点数,那么如何让它生成给定两个整数之间的随机数呢?试了一下这样可行:

select ROUND(RAND()*(10-1)+1);

也就是:

select ROUND(RAND()*(max-min)+min);

经测可行。

如图:

未分类

一个实际应用场景:比如给分数为 0 的记录,随机生成 400 到 500 之间的分数:

update civil_activity set score=round(rand()*(500-400)+400) where score=0;

这样就可以了。

mysql中时间和日期函数

一、MySQL 获得当前日期时间 函数

1.1 获得当前日期+时间(date + time)函数:now()

mysql> select now();

+---------------------+
| now() |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+

除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:

current_timestamp()
,current_timestamp
,localtime()
,localtime
,localtimestamp -- (v4.0.6)
,localtimestamp() -- (v4.0.6)

这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now() 来替代上面列出的函数。

1.2 获得当前日期+时间(date + time)函数:sysdate()

sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:

mysql> select now(), sleep(3), now();

+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+
mysql> select sysdate(), sleep(3), sysdate();

+---------------------+----------+---------------------+
| sysdate() | sleep(3) | sysdate() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:41 | 0 | 2008-08-08 22:28:44 |
+---------------------+----------+---------------------+

可以看到,虽然中途 sleep 3 秒,但 now() 函数两次的时间值是相同的; sysdate() 函数两次得到的时间值相差 3 秒。MySQL Manual 中是这样描述 sysdate() 的:Return the time at which the function executes。

sysdate() 日期时间函数,一般情况下很少用到。

2. 获得当前日期(date)函数:curdate()

mysql> select curdate();

+------------+
| curdate() |
+------------+
| 2008-08-08 |
+------------+

其中,下面的两个日期函数等同于 curdate():

current_date()
,current_date

3. 获得当前时间(time)函数:curtime()

mysql> select curtime();

+-----------+
| curtime() |
+-----------+
| 22:41:30 |
+-----------+

其中,下面的两个时间函数等同于 curtime():

current_time()
,current_time

4. 获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()

mysql> select utc_timestamp(), utc_date(), utc_time(), now()

+---------------------+------------+------------+---------------------+
| utc_timestamp() | utc_date() | utc_time() | now() |
+---------------------+------------+------------+---------------------+
| 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11 | 2008-08-08 22:47:11 |
+---------------------+------------+------------+---------------------+

因为我国位于东八时区,所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候,非常有用。

二、MySQL 日期时间 Extract(选取) 函数

1. 选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒

set @dt = '2008-09-10 07:15:30.123456';

select date(@dt); -- 2008-09-10
select time(@dt); -- 07:15:30.123456
select year(@dt); -- 2008
select quarter(@dt); -- 3
select month(@dt); -- 9
select week(@dt); -- 36
select day(@dt); -- 10
select hour(@dt); -- 7
select minute(@dt); -- 15
select second(@dt); -- 30
select microsecond(@dt); -- 123456

2. MySQL Extract() 函数,可以上面实现类似的功能:

set @dt = '2008-09-10 07:15:30.123456';

select extract(year from @dt); -- 2008
select extract(quarter from @dt); -- 3
select extract(month from @dt); -- 9
select extract(week from @dt); -- 36
select extract(day from @dt); -- 10
select extract(hour from @dt); -- 7
select extract(minute from @dt); -- 15
select extract(second from @dt); -- 30
select extract(microsecond from @dt); -- 123456

select extract(year_month from @dt); -- 200809
select extract(day_hour from @dt); -- 1007
select extract(day_minute from @dt); -- 100715
select extract(day_second from @dt); -- 10071530
select extract(day_microsecond from @dt); -- 10071530123456
select extract(hour_minute from @dt); -- 715
select extract(hour_second from @dt); -- 71530
select extract(hour_microsecond from @dt); -- 71530123456
select extract(minute_second from @dt); -- 1530
select extract(minute_microsecond from @dt); -- 1530123456
select extract(second_microsecond from @dt); -- 30123456

MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。并且还具有选取‘day_microsecond’ 等功能。注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。够强悍的吧!

MySQL Extract() 函数唯一不好的地方在于:你需要多敲几次键盘。

3. MySQL dayof… 函数:dayofweek(), dayofmonth(), dayofyear()

分别返回日期参数,在一周、一月、一年中的位置。

set @dt = '2008-08-08';

select dayofweek(@dt); -- 6
select dayofmonth(@dt); -- 8
select dayofyear(@dt); -- 221

日期 ‘2008-08-08′ 是一周中的第 6 天(1 = Sunday, 2 = Monday, …, 7 = Saturday);一月中的第 8 天;一年中的第 221 天。

4. MySQL week… 函数:week(), weekofyear(), dayofweek(), weekday(), yearweek()

set @dt = '2008-08-08';

select week(@dt); -- 31
select week(@dt,3); -- 32
select weekofyear(@dt); -- 32

select dayofweek(@dt); -- 6
select weekday(@dt); -- 4

select yearweek(@dt); -- 200831

MySQL week() 函数,可以有两个参数,具体可看手册。 weekofyear() 和 week() 一样,都是计算“某天”是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)。

MySQL weekday() 函数和 dayofweek() 类似,都是返回“某天”在一周中的位置。不同点在于参考的标准, weekday:(0 = Monday, 1 = Tuesday, …, 6 = Sunday); dayofweek:(1 = Sunday, 2 = Monday, …, 7 = Saturday)

MySQL yearweek() 函数,返回 year(2008) + week 位置(31)。

5. MySQL 返回星期和月份名称函数:dayname(), monthname()

set @dt = '2008-08-08';

select dayname(@dt); -- Friday
select monthname(@dt); -- August

思考,如何返回中文的名称呢?

6. MySQL last_day() 函数:返回月份中的最后一天。

select last_day('2008-02-01'); -- 2008-02-29
select last_day('2008-08-08'); -- 2008-08-31

MySQL last_day() 函数非常有用,比如我想得到当前月份中有多少天,可以这样来计算:

mysql> select now(), day(last_day(now())) as days;
+---------------------+------+
| now() | days |
+---------------------+------+
| 2008-08-09 11:45:45 | 31 |
+---------------------+------+

三、MySQL 日期时间计算函数

1. MySQL 为日期增加一个时间间隔:date_add()

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() 实现 addtime() 功能示例:

mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03 |
+------------------------------------------------+
mysql> select date_add(@dt, interval '1 01:15:30' day_second);

+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03 |
+-------------------------------------------------+

date_add() 函数,分别为 @dt 增加了“1小时 15分 30秒” 和 “1天 1小时 15分 30秒”。建议:总是使用 date_add() 日期时间函数来替代 adddate(), addtime()。

2. MySQL 为日期减去一个时间间隔:date_sub()

mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59 |
+----------------------------------------------------------------+

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。

3. MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)

函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。

MySQL period_add(P,N):日期加/减去N月。

mysql> select period_add(200808,2), period_add(20080808,-2)

+----------------------+-------------------------+
| period_add(200808,2) | period_add(20080808,-2) |
+----------------------+-------------------------+
| 200810 | 20080806 |
+----------------------+-------------------------+

MySQL period_diff(P1,P2):日期 P1-P2,返回 N 个月。

mysql> select period_diff(200808, 200801);

+-----------------------------+
| period_diff(200808, 200801) |
+-----------------------------+
| 7 |
+-----------------------------+

在 MySQL 中,这两个日期函数,一般情况下很少用到。

4. MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减 date1 – date2,返回天数。

select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 – time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

四、MySQL 日期转换函数、时间转换函数

1. MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)

select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'

2. MySQL (日期、天数)转换函数:to_days(date), from_days(days)

select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627

select from_days(0); -- '0000-00-00'
select from_days(733627); -- '2008-08-08'

3. MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

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 手册。

4. MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)

mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y');

+------------------------------------------------+
| date_format('2008-08-08 22:23:00', '%W %M %Y') |
+------------------------------------------------+
| Friday August 2008 |
+------------------------------------------------+
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> select time_format('22:23:01', '%H.%i.%s');

+-------------------------------------+
| time_format('22:23:01', '%H.%i.%s') |
+-------------------------------------+
| 22.23.01 |
+-------------------------------------+

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。

5. MySQL 获得国家地区时间格式函数:get_format()

MySQL get_format() 语法:

get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

MySQL get_format() 用法的全部示例:

select get_format(date,'usa') ; -- '%m.%d.%Y'
select get_format(date,'jis') ; -- '%Y-%m-%d'
select get_format(date,'iso') ; -- '%Y-%m-%d'
select get_format(date,'eur') ; -- '%d.%m.%Y'
select get_format(date,'internal') ; -- '%Y%m%d'
select get_format(datetime,'usa') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'jis') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'iso') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'eur') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'internal') ; -- '%Y%m%d%H%i%s'
select get_format(time,'usa') ; -- '%h:%i:%s %p'
select get_format(time,'jis') ; -- '%H:%i:%s'
select get_format(time,'iso') ; -- '%H:%i:%s'
select get_format(time,'eur') ; -- '%H.%i.%s'
select get_format(time,'internal') ; -- '%H%i%s'

MySQL get_format() 函数在实际中用到机会的比较少。

6. MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'

select maketime(12,15,30); -- '12:15:30'

五、MySQL 时间戳(Timestamp)函数

1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

mysql> select current_timestamp, current_timestamp();

+---------------------+---------------------+
| current_timestamp | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+

2. MySQL (Unix 时间戳、日期)转换函数:

unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

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'

3. MySQL 时间戳(timestamp)转换、增、减函数:

timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr) --
timestampdiff(unit,datetime_expr1,datetime_expr2) --

请看示例部分:

select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()。

select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。

六、MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

node+mongodb建站攻略

如何利用node+mongodb来快速搭建一个电影网站?

一、后端部分

整个网站的后端是由node.js来驱动的,所以在后端需要安装node.js,以及在这个基础之上的框架express,它能够帮助我快速的搭建web应用,然后数据库选用的mongodb,以及对mongodb快速建模的工具mongoose。后端的模板引擎用的是jade关于时间个日期的格式化选用的是Moment.js底下的这四个模块都是通过npm安装的,npm是node自带的。

未分类

二、前端部分

前端部分会选用jQuery的类库以及boostrap的样式的框架,它们都是网站前端的静态资源,网站前端的静态资源都存在一个版本的依赖和版本的管理,所以我们需要通过Bower来安装它们,Bower本身也是一个npm模块,所以它也需要现有npm的安装方。

未分类

三、本地的开发环境

本地的开发环境后面的网站会用到less的编译,样式的合并,语法的检查,包括前后端单元测试的实现,以及服务的自动重启,这几个任务都是通过grunt来集成。

未分类

四、实战步骤

选择完这些框架以后,就可以来开始实战,项目开发分为九个步骤

未分类

1、需求分析:看一下开发一共有多少个页面,页面里都有什么样的内容和需求以及什么样的交互,这样做到心里有数。

2、项目依赖初始化:然后对项目所依赖的模块进行一个安装和 初始目录的创建。

3、入口文件编码:在后端开始创建一个入口文件并且进行编码。

4、创建试图:编码以后就可以来创建几个重要页面的视图了,也就是模板。

5、测试前端流程 :来跑通前后端的流程,也就是说,从浏览器发起一个请求到后端,后端接收到之后,返回一段数据。

6、样式开发,伪造模板数据  :跑通前后端之后,就可以对页面进行一个样式的开发和一些HTML的dom结构的填充,同时要伪造一些模板数据。

7、设计数据库模型:这时候页面都有了,我们开始基于页面里面的内容同时来设计数据库的模型。

8、开发后端逻辑:然后来开发后端的逻辑,到这一步为止,前后端的逻辑都已经实现掉了。

9、配置依赖文件,网站开发结束:对前端静态资源版本和后端模块版本进行一个配置文件的生成,然后整个网站就开发结束了。

五、详细开发

然后来看一下网站的页面 ,左边是首页,有一个电影列表,把存在数据库里面的电影全部都取出来展现在这里,每一个海报都有电影名称和播放按钮,点击海报或者播放按钮就会跳转到右边这个页面,也就是详情页,详情页就是这部电影所针对的更加详细的介绍字段之类的东西。

未分类

后台录入页:其实这里就是一个表单,在后端能够填写一些和电影有关的数据,点击最底下的录入按钮的时候,会将这张表上的数据提交到后台,后台就会存到数据库,也就是mongodb里面,右边是列表页,当存入一定数据的电影的时候,我们可以进行批量的管理,比如更新或者删除。

未分类

Docker配置NodeJS+MongoDB

未分类

需求

在Docker中运行一个Nodejs项目,连接Mongo数据库进行数据操作,并启动RockMongo容器。

思路

  • 使用容器连接(link)方法,Mongo容器与WebApp容器连接
  • 数据库连接语句要通过容器别名构建!!!
  • 宿主机只需监听Web端口即可
  • Rockmongo用于图形化界面管理数据库

前期准备

服务器上已有nodejs环境并可运行,根目录在/usr/local/node
项目中的数据库连接语句改成数据库容器别名,实例化Mongo容器时–name casebasedb,mongoose连接语句改为

var store = new SessionStore({url: 'mongodb://containerdb/session',interval: 1440});
mongoose.connect('mongodb://containerdb:27017/casebasedb', {useMongoClient: true,});

拉取镜像

$ sudo docker pull node
$ sudo docker pull mongo
$ sudo docker pull pataquets/rockmongo

构建Web镜像

编写Dockerfile

$ vim /***/Dockerfile

Dockerfile内容

FROM node:latest # 基于node镜像
COPY . /***/casebase # 项目源文件目录
COPY . /usr/local/node # 直接拖进去的node环境
WORKDIR /***/casebase # nodejs运行目录
RUN npm install # 重新安装下依赖包
EXPOSE 8001 # 暴露端口8001
CMD ["node", "app.js"] # 执行命令

根据Dockerfile新建镜像,命令结尾的 . 是指示Dockerfile文件在当前目录下

$ sudo docker build -t hugh/casebase .

实例化容器

  • -p映射到当前8001端口;
  • –link语句连接数据库 [数据库容器名]:[容器别名]
  • 当连接成功后在web容器中可以直接ping到[容器别名containerdb]作为主机标识,所以一定要将数据库连接语句中的主机改成[容器别名]!!!
$ sudo docker run -d --name casebasedb mongo
$ sudo docker run --name casebaseapp -d -p 8001:8001 --link casebasedb:containerdb hugh/casebase 
$ sudo docker run --name rockapp -d -p 8003:80 --link casebasedb:containerdb pataquets/rockmongo

验证容器

查看容器情况

$ sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                    NAMES
4e2ab928a683        dh/casebase:17.09.16.1   "node app.js"            14 minutes ago      Up 14 minutes       0.0.0.0:8001->8001/tcp   casebaseapp
66e6ba5f5873        mongo                    "docker-entrypoint..."   17 minutes ago      Up 17 minutes       27017/tcp                casebasedb

查看端口监听情况

$ sudo netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::8001                 :::*                    LISTEN      32211/docker-proxy

访问宿主机ip:8001,此时已可以访问web项目了。

linux服务器下如何查看memcached的运行情况

查看memcached的运行情况有两种办法:

方法一、登录服务器通过命令查询

通过SSL登录服务器,在命令行输入:

echo stats | nc 127.0.0.1 11211

能看到如下内容:

未分类

重点关注两行数据即可:

STAT get_hits xxxx

命中了多少次缓存,也就是从 Memcached 缓存中成功获取数据的次数

STAT get_misses xxxx

没有命中的次数

方法二、使用memcached官方的探针

具体方法参见: https://www.liangshare.com/linux/8340.html

安装探针之后,访问探针页面,能看到如下信息:

未分类

其中右边长方形的柱形图,绿色表示命中率,橘色表示未命中率。

Centos7 MariaDB安装

MariaDB 是 MySQL 数据库的自由开源分支,与 MySQL 在设计思想上同出一源,在未来仍将是自由且开源的。Red Hat Enterprise Linux/CentOS 7.0 发行版已将默认的数据库从 MySQL 切换到 MariaDB.

安装MariaDB-server

yum -y update  
yum -y install mysql  
yum -y install mariadb-server mariadb-client  
systemctl enable mariadb  
systemctl start mariadb  
systemctl status mariadb  
[root@centos-rpi2 ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2017-10-11 09:46:50 HKT; 4h 12min ago
Main PID: 1425 (mysqld_safe)
CGroup: /system.slice/mariadb.service
├─1425 /bin/sh /usr/bin/mysqld_safe –basedir=/usr
└─1587 /usr/libexec/mysqld –basedir=/usr –datadir=/var/lib/mysql…
Oct 11 09:46:36 centos-rpi2 mariadb-prepare-db-dir[1346]: Initializing MariaD…
Oct 11 09:46:37 centos-rpi2 mariadb-prepare-db-dir[1346]: 171011 9:46:37 [No…
Oct 11 09:46:38 centos-rpi2 mariadb-prepare-db-dir[1346]: 171011 9:46:38 [No…
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: PLEASE REMEMBER TO …
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: To do so, start the…
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: ‘/usr/bin/mysqladmi…
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: ‘/usr/bin/mysqladmi…
Oct 11 09:46:40 centos-rpi2 mysqld_safe[1425]: 171011 09:46:40 mysqld_safe L….
Oct 11 09:46:40 centos-rpi2 mysqld_safe[1425]: 171011 09:46:40 mysqld_safe S…l
Oct 11 09:46:50 centos-rpi2 systemd[1]: Started MariaDB database server.
Hint: Some lines were ellipsized, use -l to show in full.

配置root账户

mysql -u root -p

直接回车

[root@centos-rpi2 ~]# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 5
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the current input statement.

MariaDB [(none)]>
use mysql;  
update user set password=password('Shuai_sqj') where user='root';  
grant all privileges on *.* to 'root'@'%' identified by 'Shuai_sqj' with grant option;  
//创建root远程管理  
flush privileges;  
exit

如何在CENTOS/REDHAT/FEDORA中安装MARIADB GALERA CLUSTER 10.0(数据库集群)

MariaDB Galera Cluster 10.0.12稳定已被释放,可供生产使用。MariaDB的是一个关系型数据库管理系统(RDBMS)。一般我们使用的小型应用程序,使用数据库服务器的单个节点服务。但是当有成千上万的用户不断在网上请求访问应用程序时,在这种情况下,我们需要一个架构,这将能够处理这种负载,并提供高可用性。因此,我们需要增加彼此互连的多个数据库服务器,并保持同步,因此在任何情况下,某一服务器出现故障,其他服务器可以继续向用户提供服务。

未分类

本文将帮助你建立MariaDB Galera Cluster10.0.12用CentOS 6.5运行3个节点。集群服务器具体如下。

  • 集群DB1:192.168.1.10(主机名: db1.howtoing.com )
  • 集群DB2:192.168.1.20(主机名: db2.howtoing.com )
  • 集群DB3:192.168.1.30(主机名: db3.howtoing.com )

注意: 第1步/2/3 将完成所有群集节点,操作过程和节点具体配置。

第1步:添加MariaDB存储库

创建一个MariaDB存储库/etc/yum.repos.d/mariadb.repo在你的系统中使用下面的内容。 下面存储库将在CentOS 6.x的系统工作,对于其他系统中使用存储库生产工具,并添加到您的系统。 在CentOS 6 – 64位

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

在CentOS 6 – 32位

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-x86
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

第2步:安装MariaDB和Galera

安装MariaDB Galera群集程序包之前,删除系统上安装任何现有的MySQL或MariaDB的包。并在所有节点上使用以下命令安装。

# yum install MariaDB-Galera-server MariaDB-client galera

第3步:初始MariaDB配置

在上述步骤成功安装包之后,做一些初步MariaDB的配置。使用下列命令并按照群集的所有节点上的说明。它将提示设置root帐户密码。

# service mysql start
# mysql_secure_installation

之后,创建所有的节点用户,它可以从您的网络集群中的访问数据库中MariaDB的用户。

# mysql -u root -p

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'cluster'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

启动群集配置之前停止MariaDB服务

# service mysql stop

第4步:DB1设置MariaDB Galera Cluster

让我们安装MariaDB Galera Cluster从DB1服务器开始。编辑MariaDB服务器配置文件,并在[MariaDB]部分添加下面的值。

[root@db1 ~]# vim /etc/my.cnf.d/server.cnf
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20,192.168.1.30"
wsrep_cluster_name='cluster1'
wsrep_node_address='192.168.1.10'
wsrep_node_name='db1'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:password

使用以下命令启动集群。

[root@db1 ~]# /etc/init.d/mysql bootstrap
Bootstrapping the clusterStarting MySQL.... SUCCESS!

如果你在启动过程中有任何问题,请检查MariaDB的错误日志文件,在 /var/lib/mysql/.err

第5步:添加DB2,在MariaDB的集群中

DB1成功启动集群后。在DB2上开始配置。编辑MariaDB的服务器配置文件,并在[MariaDB]部分添加下面的值。所有设置都差不多,除了wsrep_node_address,wsrep_cluster_address和wsrep_node_name DB1 。

[root@db2 ~]# vim /etc/my.cnf.d/server.cnf
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20,192.168.1.30"
wsrep_cluster_name='cluster1'
wsrep_node_address='192.168.1.20'
wsrep_node_name='db2'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:password

使用以下命令启动集群。

[root@db2 ~]# /etc/init.d/mysql start
Starting MySQL..... SUCCESS!

第6步:添加DB3,在MariaDB的集群中

此服务器是可选的,如果你想只有两个集群服务器,则可以忽略这一步,如果不配置DB3 你需要从DB1/DB2配置文件中删除第三个服务器IP。要添加此服务器进行修改和DB2一样。

[root@db3 ~]# vim /etc/my.cnf.d/server.cnf
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20,192.168.1.30"
wsrep_cluster_name='cluster1'
wsrep_node_address='192.168.1.30'
wsrep_node_name='db2'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:password

使用以下命令启动集群。

[root@db3 ~]# /etc/init.d/mysql start
Starting MySQL..... SUCCESS!

第7步:测试MariaDB的Galera群集设置

在这个阶段,您的群集安装已经完成,并正常运行。现在,您可以测试通过在集群的任何服务器创建数据库和表群集安装,它会立即复制到群集中的所有服务器。

简述linux下lvm 磁盘扩容

查看扩容之前的磁盘状况

[root@localhost ~]# df -h

[root@localhost ~]# fdisk -l

创建物理卷(PV)

#pvcreate /dev/sdc ---输入磁盘实际路径

格式化新硬盘

[root@localhost ~]# mkfs.ext4 /dev/sdc

mke2fs 1.41.12 (17-May-2010)

/dev/sda is entire device, not just one partition!

Proceed anyway? (y,n) y

***询问是否继续,输入Y,确定

查看系统PV的情况:

[root@localhost ~]# pvdisplay

--- NEW Physical volume ---

PV Name               /dev/sdc

VG Name                //新建的PV的VG name是空的,下一步就是把PV加入VG

PV Size               15.00 GiB

Allocatable           NO

......

查看原VG的情况

[root@localhost ~]# vgdisplay

--- Volume group ---

VG Name               VolGroup //注意记录此名字,扩容时将新的pv加入指定的名字

System ID

Format                lvm2

Metadata Areas        1

Metadata Sequence No  3

......

扩展卷组,将/dev/sdc物理卷添加到VolGroup卷组中

[root@localhost ~]# vgextend VolGroup /dev/sdb

Volume group "VolGroup" successfully extended

至此完成新硬盘扩展!

LVM扩展空间步骤

当LV空间利用率较大即将耗尽LV空间时,我们可以将一块新的磁盘或者一块磁盘上的free空间加入LV,步骤如下:

现在/home空间如下:

[root@localhost ~]# df -h
文件系统                      容量    已用   可用   已用%    挂载点
/dev/mapper/rootvg-rootlv    7.6G   2.0G   5.2G   28%     /
/dev/sda1                    99M    11M    83M    12%     /boot
tmpfs                        125M   0      125M   0%      /dev/shm
/dev/mapper/rootvg-homelv    496M   19M    452M   4%      /home

1、新建LVM类型分区:

[root@localhost ~]# fdisk /dev/sda              \对硬盘sda进行分区操作

Command (m for help): n             \创建新的分区
First cylinder (1160-1305, default 1160):1160            \指定起始柱面
Last cylinder or +size or +sizeM or +sizeK(1160-1305, default 1305): 1305     \指定终止柱面

Command (m for help): p      \查看当前分区表信息

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280bytes

  Device Boot      Start         End      Blocks  Id  System
/dev/sda1  *           1          13      104391  83  Linux
/dev/sda2              14         395    3068415   8e  Linux LVM
/dev/sda3            396         777    3068415   8e  Linux LVM
/dev/sda4             778        1305    4241160    5  Extended
/dev/sda5             778        1159    3068383+  8e  Linux LVM
/dev/sda6            1160        1305    1172713+  83  Linux  \刚刚新建的分区

Command (m for help): t       \改变分区类型
Partition number (1-6): 6       \指定分区编号
Hex code (type L to list codes): 8e        \更改为LVM类型分区
Changed system type of partition 6 to 8e(Linux LVM)

Command (m for help): w     \保存退出
The partition table has been altered!

2、创建新的PV

[root@localhost ~]# partprobe            \使用partprobe指令更新内核的中硬盘分区表信息
[root@localhost ~]# pvcreate /dev/sda6              \创建新的PV-----------lsblk查看硬盘,可以不执行第一步,直接建立PV
 Physical volume "/dev/sda6" successfully created
[root@localhost ~]# pvscan
  PV/dev/sda2   VG rootvg   lvm2 [2.93 GB / 0    free]
  PV/dev/sda3   VG rootvg   lvm2 [2.93 GB / 0    free]
  PV/dev/sda5   VG rootvg   lvm2 [2.93 GB / 0    free]
 PV /dev/sda6               lvm2[1.12 GB]     \新创建的PV但是尚未加入任何VG组
 Total: 4 [9.90 GB] / in use: 3 [8.78 GB] / in no VG: 1 [1.12 GB]

3、将PV加入VG组

[root@localhost ~]# vgextend rootvg /dev/sda6
 Volume group "rootvg" successfully extended

[root@localhost ~]# pvscan
  PV/dev/sda2   VG rootvg   lvm2 [2.93 GB / 0    free]
  PV/dev/sda3   VG rootvg   lvm2 [2.93 GB / 0    free]
  PV/dev/sda5   VG rootvg   lvm2 [2.93 GB / 0    free]
 PV /dev/sda6   VG rootvg   lvm2 [1.12 GB / 1.12 GB free]    \已经加入rootvg组
 Total: 4 [9.89 GB] / in use: 4 [9.89 GB] / in no VG: 0 [0   ]

4、将VG组中的空闲空间划出100M到/home分区所在的LV

[root@localhost ~]# lvextend -L +100M /dev/rootvg/homelv
 Extending logical volume homelv to 612.00 MB
 Logical volume homelv successfully resized

5、使用resizefs2命令重新加载逻辑卷的大小才能生效

[root@localhost ~]# resize2fs /dev/rootvg/homelv
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/rootvg/homelv is mountedon /home; on-line resizing required
Performing an on-line resize of/dev/rootvg/homelv to 626688 (1k) blocks.
The filesystem on /dev/rootvg/homelv is now626688 blocks long.

查看增加空间后的/home空间

[root@localhost ~]# df -h
文件系统                      容量    已用   可用   已用%    挂载点
/dev/mapper/rootvg-rootlv    7.6G   2.0G   5.2G   28%     /
/dev/sda1                    99M    11M    83M    12%     /boot
tmpfs                        125M   0      125M   0%      /dev/shm
/dev/mapper/rootvg-homelv    593M   19M    544M   4%      /home

Logrotate的常见配置

缩小日志大小和备份文件用

如果想测试配置文件

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

下面是nginx php和mysql的日志设置

/var/log/nginx/*.log {
        daily
        size 1G
        missingok
        rotate 10
        compress
        delaycompress
        notifempty
        create 0640 nobody nobody
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then 
                        run-parts /etc/logrotate.d/httpd-prerotate; 
                fi 
        endscript
        postrotate
                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
        endscript
}


/usr/local/php/var/log/php-fpm.log /usr/local/php/var/log/php-fpm.log.slow {
    dateext
    create
    #maxage 90
    rotate 60
    missingok
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/run/php-fpm.pid`
    endscript
}

/var/lib/mysql/slow-log /var/lib/mysql/localhost.err {
    dateext
    create
    # notifempty
    #maxage 90
    rotate 60
    missingok
    sharedscripts
    postrotate
        /usr/local/mysql/bin/mysqladmin -uroot -p'password' flush-logs
    endscript
}