一、MySQL介绍

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性

特点:

性能卓越,服务稳定,很少出现宕机

开放源代码且无版权制约,自主性强,使用成本低

支持多操作系统,提供多种API接口,支持多种开发语言(Python,Php,Java等)

二、MySQL安装方式

1.yum安装     (适合对数据库要求不太高的场合)

大的门户网站把源码根据企业需求制作成rpm,搭建yum仓库

2.常规方式编译安装

.configure/make/make install    (mysql 5.1及以前)

cmake /make /make install

序号

MySQL安装方式

特点说明

1

yum/rpm安装

简单,部署速度快,但是没法定制安装,适合新手

2

二进制安装

解压软件,简单配置后就可以使用,不用安装,部署速度较快,专业DBA常用这种方式,软件名如:mysql-5.5.50-linux2.6-x86_64.tar.gz

3

源码编译安装

可以定制安装(指定字符集,安装路径等),但是安装时间长

4

源码软件结合yum/rpm安装

把源码软件制作成符合要求的rpm,放到yum仓库,然后通过yum来安装,结合了1和3的优点,安装快速,可以任意定制参数

三、MySQL安装实战(源码cmake方式编译安装MySQL)

1.下载mysql/cmake安装包

1
2
3
[root@master ~]# mkdir /home/tools
[root@master ~]# wget –P /home/tools https://cmake.org/files/v2.8/cmake-2.8.12.tar.gz

2.建立账号

1
2
3
4
5
6
[root@master ~]# groupadd mysql
[root@master ~]# useradd -s /sbin/nologin -g mysql -M mysql
useradd参数说明:
   -s /sbin/nologin        # 表示禁止该用户登录,只需角色存在即可,加强安全
   -g mysql                # 指定属组
   -M                      # 表示不创建用户家目录

3.配置安装环境

创建目录并授权

1
2
3
4
[root@master ~]# mkdir -p /usr/local/mysql
[root@master ~]# mkdir -p /db/mysql
[root@master ~]# chown -R mysql.mysql /usr/local/mysql
[root@master ~]# chown -R mysql.mysql /db

安装依赖

1
[root@master ~]# yum install gcc gcc-c++ make cmake ncurses-devel bison perl -y

配置解析

1
2
3
4
[root@master ~]# hostname
master.opsedu.com
[root@master ~]# vim /etc/hosts
192.168.10.66   master        # 添加一条

4.安装mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@master tools]# tar -zxf mysql-5.5.50.tar.gz
[root@master tools]# cd mysql-5.5.50
[root@master mysql-5.5.50]# cmake \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \
> -DMYSQL_DATADIR=/db/mysql \
> -DMYSQL_TCP_PORT=3306 \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DEXTRA_CHARSETS=all \
> -DENABLED_LOCAL_INFILE=ON \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
> -DWITH_FEDERATED_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
> -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
> -DWITH_FAST_MUTEXES=1 \
> -DWITH_ZLIB=bundled \
> -DENABLED_LOCAL_INFILE=1 \
> -DWITH_READLINE=1 \
> -DWITH_EMBEDDED_SERVER=1 \
> -DWITH_DEBUG=0 \
> -DMYSQL_UNIX_ADDR=/tmp/mysql.sock
[root@master mysql-5.5.50]# make          # 编译
[root@master mysql-5.5.50]# make install

5.初始化mysql

配置mysql环境变量

1
2
[root@master mysql-5.5.50]# echo 'export PATH=/usr/local/mysql/bin:$PATH' >>/etc/profile
[root@master mysql-5.5.50]# source /etc/profile

查看配置文件

1
2
3
4
5
6
7
[root@master mysql-5.5.50]# ll support-files/*.cnf
-rw-r--r-- 1 root root  4667 Jul9 01:26 support-files/my-huge.cnf
-rw-r--r-- 1 root root 19759 Jul  9 01:26 support-files/my-innodb-heavy-4G.cnf
-rw-r--r-- 1 root root  4641 Jul9 01:26 support-files/my-large.cnf
-rw-r--r-- 1 root root  4652 Jul9 01:26 support-files/my-medium.cnf
-rw-r--r-- 1 root root  2816 Jul9 01:26 support-files/my-small.cnf
[root@master mysql-5.5.50]# /bin/cp support-files/my-small.cnf /etc/my.cnf          # copy配置文件

创建mysql数据库文件

1
[root@master mysql-5.5.50]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/db/mysql --user=mysql

以上命令主要是生成mysql库及相关文件:

这些文件是mysql正确运行所必需的基本数据库文件,其功能是对mysql权限、状态等进行管理

启动mysql

1
2
3
[root@master mysql-5.5.50]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
[root@master mysql-5.5.50]# netstat -lnt|grep 3306
tcp        0  0 0.0.0.0:3306          0.0.0.0:*             LISTEN

配置mysql开机启动

1
2
3
4
[root@master mysql-5.5.50]# cp support-files/mysql.server /etc/init.d/mysqld
[root@master mysql-5.5.50]# chmod 700 /etc/init.d/mysqld
[root@master mysql-5.5.50]# chkconfig --add mysqld
[root@master mysql-5.5.50]# chkconfig mysqld on

初始化遇见错误

示例1:

WARING:The host ‘mysql’ could not be locked up with resolveip

需要修改主机名的解析,使其和usernae –n一样

示例2:

ERROR:1004 Can’t create file ‘/tmp/#sql300e_1_0.frm’(errno:13)

原因是/tmp权限有问题(不解决,后面可能无法登陆数据库)

6.后续操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@master mysql-5.5.50]# mysql       # mysql安装好后,默认没有密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.50 Source distribution
  
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
  
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
 
# 为mysql增加(设定)密码
[root@master mysql-5.5.50]# mysqladmin -uroot password 'q.123456'

7. 单实例MySQL自动部署脚本

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#!/bin/env python
# -*- coding:utf-8 -*-
'''
MySQL部署py
'''
 
import os, sys, subprocess
import time, datetime
import socket
import shutil
 
 
class MySQL_init:
    '''
    MySQL编译安装py
    '''
 
    def __init__(self):
        self.url = 'ftp://xxx:xxx@x.x.x.x:port/mysql'           # mysql的编译参数,写入到文件中,放在ftp上
        self.ret = []
        self.compile = []
        self.count = 0
        self.status = ' '
 
    @staticmethod
    def get_local_ip():
        '''
        获取服务器IP,如果有公网地址就取公网IP,没有公网地址就取私网IP
        :return:
        '''
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            sock.connect(('8.8.8.8', 80))
            (addr, port) = sock.getsockname()
            sock.close()
            return addr
        except socket.error:
            return "127.0.0.1"
 
    def install_check(self):
        '''
        检查命令是否执行成功
        :return: True:成功 False:失败(每个方法最后统一检查)
        '''
        for i in self.ret:
            self.count += i
        if self.count == 0:
            print('#INFO ==================== \033[1;32mThe command execution success.\033[0m ====================')
            time.sleep(3)
            return True
        else:
            print('#INFO ==================== \033[1;31mThe command execution failed.\033[0m ====================')
            time.sleep(3)
            return False
 
 
    def install_cmd(self, arg):
        '''
        收集shell命令执行结果
        :param arg: 命令字符串
        :return: 返回执行状态
        '''
        val = subprocess.call(arg, shell=True, stdout=subprocess.PIPE)
        self.ret.append(val)
        return val
 
 
    def MySQL_download(self):
        '''
        下载安装包
        :return:False:下载执行失败
        '''
        print '#INFO ==================== \033[1;33mBegan to download MySQL installation package\033[0m ===================='
        time.sleep(3)
        try:
            os.makedirs('/home/tools')
        except OSError as e:
            pass
        os.chdir('/home/tools')
        self.install_cmd('wget -c %s/mysql-5.5.50.tar.gz' % self.url)
        if self.install_check() == False:
            return False
 
 
    def MySQL_add_acc(self):
        '''
        添加账号
        :return:True:账号已存在 False:账号添加失败
        '''
        print '#INFO ==================== \033[1;33mBegin creating MySQL account\033[0m ===================='
        time.sleep(3)
        self.acc = raw_input('请输入要创建账号名:').strip()
        self.status = subprocess.call('id %s > /dev/null 2>1' %self.acc,shell=True)
        if self.status == 0:
            print('#INFO ==================== \033[1;32mThe command execution success.\033[0m ====================')
            time.sleep(3)
            return True
        else:
            self.install_cmd('groupadd {user} && useradd -s /sbin/nologin -g {user} -M {user}'.format(user=self.acc))
            if self.install_check() == False:
                return False
 
 
 
    def MySQL_conf_env(self):
        '''
        配置mysql安装环境
        :return:
        '''
        print '#INFO ==================== \033[1;33mStart configuring the MySQL installation environment\033[0m ===================='
        time.sleep(3)
        self.install_path = raw_input('请输入一个不存在的目录(安装目录):').strip()
        self.data_path = raw_input('请输入一个不存在的目录(数据存放目录):').strip()
        if os.path.isdir(self.install_path) and os.path.isdir(self.data_path):
            pass
        else:
            try:
                os.makedirs(self.install_path)
                os.makedirs(self.data_path)
            except OSError as e:
                pass
        self.install_cmd('chown -R {user}.{user} {path1} {path2}'.format(user=self.acc, path1=self.install_path,path2=self.data_path))
        ret = subprocess.call('yum -y install gcc gcc-c++ make cmake ncurses-devel bison perl', shell=True)
        if self.install_check() == True and ret == 0:
            pass
        else:
            return False
        self.hostname = socket.getfqdn(socket.gethostname())
        # self.ip = socket.gethostbyname(socket.gethostname())      # 不知怎么回事,不同linux OS,有时可以获取到IP,有时会报‘socket.gaierror’错误
        self.ip = MySQL_init.get_local_ip()
        with open('/etc/hosts', 'a') as f:
            f.write('\n{ip}\t{hostname}'.format(ip=self.ip, hostname=self.hostname))
 
 
 
    def MySQL_install(self):
        '''
        安装MySQL
        :return:
        '''
        print '#INFO ==================== \033[1;33mStart installing MySQL\033[0m ===================='
        time.sleep(3)
        os.chdir('/home/tools')
        self.install_cmd('tar zxf mysql-5.5.50.tar.gz')
        os.chdir('mysql-5.5.50')
        self.install_cmd('wget -c {url}/compile.conf'.format(url=self.url))
        with open('compile.conf', 'r+') as f:
            for lines in f:
                self.compile.append(lines.strip())
        self.compile[0] = '-DCMAKE_INSTALL_PREFIX=%s' % self.install_path
        self.compile[1] = '-DMYSQL_DATADIR=%s' % self.data_path
        self.status = ' '
        self.compile = self.status.join(self.compile)
        rets = subprocess.call('cmake %s' % self.compile, shell=True)
        vals = subprocess.call('make -j 2 && make install', shell=True)
        if rets == vals == 0:
            pass
        else:
            return False
        os.remove('compile.conf')
        if self.install_check() == False:
            return False
 
    def MySQL_env_init(self):
        '''
        初始化mysql
        :return:
        '''
        print '#INFO ==================== \033[1;33mStart initialized MySQL\033[0m ===================='
        time.sleep(3)
        self.install_cmd("echo 'export PATH={ins_path}/bin:$PATH' >>/etc/profile".format(ins_path=self.install_path))
        self.install_cmd('source /etc/profile')
        shutil.copyfile('support-files/my-small.cnf', '/etc/my.cnf')
        self.install_cmd('{path1}/scripts/mysql_install_db --basedir={path1} --datadir={path2} --user={user}'.format(path1=self.install_path, path2=self.data_path, user=self.acc))
        if self.install_check() == False:
            return False
 
 
    def MySQL_boot(self):
        '''
        启动MySQL
        :return:
        '''
        print '#INFO ==================== \033[1;33mStarting MySQL...\033[0m ===================='
        self.install_cmd('{path}/bin/mysqld_safe --user={user} &'.format(path=self.install_path, user=self.acc))
        print '\r'
        time.sleep(5)
        rests = self.install_cmd('netstat -an | grep 3306 >/dev/null')
        if rests == 0:
            pass
        else:
            return False
        self.install_cmd('/bin/cp support-files/mysql.server /etc/init.d/mysqld')
        self.install_cmd('chmod 700 /etc/init.d/mysqld')
        self.install_cmd('chkconfig --add mysqld && chkconfig mysqld on')
        if self.install_check() == False:
            return False
        else:
            print '#INFO \033[1;32mMySQL installation was successful.\033[0m'
 
 
    def main(self):
        ret = MySQL_init()
        if ret.MySQL_download() == False:
            print '\033[1;31m#INFO ==========> MySQL 安装包下载失败\033[0m.'
            sys.exit(1)
        elif ret.MySQL_add_acc() == False:
            print '\033[1;31m#INFO ==========> MySQL 账号创建失败\033[0m.'
            sys.exit(2)
        elif ret.MySQL_conf_env() == False:
            print '\033[1;31m#INFO ==========> MySQL 安装环境配置失败\033[0m.'
            sys.exit(3)
        elif ret.MySQL_install() == False:
            print '\033[1;31m#INFO ==========> MySQL 安装失败\033[0m.'
            sys.exit(4)
        elif ret.MySQL_env_init() == False:
            print '\033[1;31m#INFO ==========> MySQL 初始化失败\033[0m.'
            sys.exit(4)
        elif ret.MySQL_boot() == False:
            print '\033[1;31m#INFO ==========> MySQL 启动失败\033[0m.'
            sys.exit(5)
 
 
if __name__ == '__main__':
    val = MySQL_init()
    val.main()

MySQL 第一篇的更多相关文章

  1. 详解MySQL第一篇—MySQL简要介绍及DDL语句

    背景:近几年,开源数据库逐渐流行起来.由于具有免费使用.配置简单.稳定性好.性能优良等优点,开源数据库在中低端应用上占据了很大的市场份额,而 MySQL 正是开源数据库中的杰出代表.MySQL 数据库 ...

  2. mycat操作MySQL第一篇:全局表

    1.安装mycat,点击bin下面startup_nowrap.bat启动 2.客户端连接mycat:server.xml里面的 <!--连接mycat用户名和密码.数据库--> < ...

  3. MySQL 第一篇:初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  4. 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)

    Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...

  5. 【转帖】Mysql多维数据仓库指南 第一篇 第1章

     Mysql多维数据仓库指南 第一篇基本原理 章节列表: 第1章:基本组成 第2章:维度历史 第3章:维度可加性 第4章:维度查询 本篇概述 你将运用关系数据库来实施一个维度数据仓库.事实表和维表这两 ...

  6. 小白两篇博客熟练操作MySQL 之 第一篇

    小白两篇博客熟悉操作MySQL  之   第一篇 一.概述 1. 什么是数据库? 答: 储存数据的仓库, 如: 在ATM的事例中创建的一个db 目录, 称为数据库 2. 什么是Mysql, Oracl ...

  7. Mysql优化(出自官方文档) - 第一篇(SQL优化系列)

    Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...

  8. [译]PrestaShop开发者指南 第一篇 基础

    # 第一篇 基础 PS(PrestaShop简称)一开始就设定了能够在它的基础上很简单的构建第三方模块的机制,让它成为一款具有极高定制性的电子商务软件. PS的可以在三个方面进行定制: * 主题 * ...

  9. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

随机推荐

  1. 解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

    今天遇到了一个比较坑的问题,琢磨了好久... 因为需要引用一个第三方的类库,三方的类库引用的是Newtonsoft.Json.dll 版本7.0.0而我的项目中引用的是Newtonsoft.Json. ...

  2. ORM框架详解

    .Net开源微型ORM框架测评 什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象 ...

  3. Java内存区域

    1.运行时数据区域 java虚拟机在执行java程序的过程中会将它管理的内存区域分为若干个不同的数据区域.这些区域有各自的服务对象,创建以及销毁时间,有的内存区域随着虚拟机的启动和关闭而创建和销毁,有 ...

  4. H5的一些小问题

    [每日壹闻]常用HTML代码解释-------六.歌曲代码(1):在这组代码中,不必管它是mms.http.rtsp,只要看尾缀是asf.wma.wmv.wmv.rm都可适用下面的代码:1. 手动播放 ...

  5. unix&linux大学教程 目录

    第1章unix简介 第2章什么是linux?什么是unix 第3章unix连接 第4章开始使用unix 第5章gui:图形用户界面 第6章unix工作环境 第7章unix键盘使用 第8章能够立即使用的 ...

  6. [DFNews] Cellebrite UFED系列更新, 支持IOS7

    10月15日,Cellebrite公司对旗下产品进行了更新,包括UFED Classic.UFED Touch.Physical Analyzer.Logical Analyzer.Phone Det ...

  7. 【转】日期工具类DateUtils

    转自csdn,原作者:jzhf2012 package date.util; import java.text.ParseException; import java.text.SimpleDateF ...

  8. Linux 任务计划

    一.配置cron实现自动化 使用cron实现任务自动化可以通过修改/etc/crontab文件以及使用crontab命令实现,其结果是一样的. 1./etc/crontab文件实现自动化 cron守护 ...

  9. 两系统用asp.net forms 身份验证方式实现跨域登录信息共享

    1.两个系统的 web.config 都配置为 forms 验证方式( system.web —> authentication 节点) 2.在两个系统的Web.config里配置相同的 sys ...

  10. Robotium怎样判断测试结果

    Robotium判断测试结果的方法主要有三类:assert.is.search.assert方法除了Robotium API,还有Junit中的所有断言方法,Junit的断言方法下篇详解. void ...