zoukankan      html  css  js  c++  java
  • MySQL 第一篇

    一、MySQL介绍

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

        特点:

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

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

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

    二、MySQL安装方式

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

           大的门户网站把源码根据企业需求制作成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来安装,结合了13的优点,安装快速,可以任意定制参数

     

    三、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 ==================== 33[1;32mThe command execution success.33[0m ====================')
                time.sleep(3)
                return True
            else:
                print('#INFO ==================== 33[1;31mThe command execution failed.33[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 ==================== 33[1;33mBegan to download MySQL installation package33[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 ==================== 33[1;33mBegin creating MySQL account33[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 ==================== 33[1;32mThe command execution success.33[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 ==================== 33[1;33mStart configuring the MySQL installation environment33[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(' {ip} {hostname}'.format(ip=self.ip, hostname=self.hostname))
     
     
     
        def MySQL_install(self):
            '''
            安装MySQL
            :return:
            '''
            print '#INFO ==================== 33[1;33mStart installing MySQL33[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 ==================== 33[1;33mStart initialized MySQL33[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 ==================== 33[1;33mStarting MySQL...33[0m ===================='
            self.install_cmd('{path}/bin/mysqld_safe --user={user} &'.format(path=self.install_path, user=self.acc))
            print ' '
            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 33[1;32mMySQL installation was successful.33[0m'
     
     
        def main(self):
            ret = MySQL_init()
            if ret.MySQL_download() == False:
                print '33[1;31m#INFO ==========> MySQL 安装包下载失败33[0m.'
                sys.exit(1)
            elif ret.MySQL_add_acc() == False:
                print '33[1;31m#INFO ==========> MySQL 账号创建失败33[0m.'
                sys.exit(2)
            elif ret.MySQL_conf_env() == False:
                print '33[1;31m#INFO ==========> MySQL 安装环境配置失败33[0m.'
                sys.exit(3)
            elif ret.MySQL_install() == False:
                print '33[1;31m#INFO ==========> MySQL 安装失败33[0m.'
                sys.exit(4)
            elif ret.MySQL_env_init() == False:
                print '33[1;31m#INFO ==========> MySQL 初始化失败33[0m.'
                sys.exit(4)
            elif ret.MySQL_boot() == False:
                print '33[1;31m#INFO ==========> MySQL 启动失败33[0m.'
                sys.exit(5)
     
     
    if __name__ == '__main__':
        val = MySQL_init()
        val.main()
  • 相关阅读:
    Action/Service/DAO简介 一
    Python中的Nonetype类型怎么判断?
    idea 中使用maven命令
    python-字符串中含有变量的表示方法
    python-configparser模块,读取配置文件
    python json 和 dict
    python interpreter解释器设置
    python写入数据到excel-xlwt模块(不能修改,每次写入全覆盖)
    pymongo问题集合
    excel表操作使用记录
  • 原文地址:https://www.cnblogs.com/opsedu/p/5714039.html
Copyright © 2011-2022 走看看