加载中...

屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决


一、简介

MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。有以下特点:

  • MySQL是一种数据库管理系统。
  • MySQL是一种关联数据库管理系统。
  • MySQL软件是一种开放源码软件。
  • MySQL数据库服务器具有快速、可靠和易于使用的特点。
  • MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中。
  • 有大量可用的共享MySQL软件。

MySQL表最大能达到多少?

InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超过单独文件的最大容量。表空间可包括原始磁盘分区,从而使得很大的表成为可能。表空间的最大容量为64TB。

 

二、安装MySQL

下载MySQL地址:http://dev.mysql.com/downloads/mysql/

CentOS 安装:

  1. yum install mysql-server

Ubuntu 安装:

  1. 1. sudo apt-get install mysql-server
  2. 2. sudo apt-get isntall mysql-client
  3. 3. sudo apt-get install libmysqlclient-dev
  4. # 检测是否安装成功(是否为LISTEN状态)
  5. sudo netstat -tap | grep mysql

编译安装MySQL-5.5.32:

  1. # 安装依赖包
  2. yum install ncurses-devel gcc gcc-c++ -y
  3. # 创建目录
  4. mkdir -p /home/oldsuo/tools
  5. # 安装cmake软件,gmake编译安装
  6. cd /home/oldsuo/tools/
  7. tar xf cmake-2.8.8.tar.gz
  8. cd cmake-2.8.8
  9. ./configure
  10. #CMake has bootstrapped. Now run gmake.
  11. gmake
  12. gmake install
  13. cd ../
  14.  
  15.  
  16. # 开始安装mysql
  17. # 创建用户和组
  18. groupadd mysql
  19. useradd mysql -s /sbin/nologin -M -g mysql
  20. # 解压编译MySQL
  21. tar zxf mysql-5.5.32.tar.gz
  22. cd mysql-5.5.32
  23. cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \
  24. -DMYSQL_DATADIR=/application/mysql-5.5.32/data \
  25. -DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock \
  26. -DDEFAULT_CHARSET=utf8 \
  27. -DDEFAULT_COLLATION=utf8_general_ci \
  28. -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
  29. -DENABLED_LOCAL_INFILE=ON \
  30. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  31. -DWITH_FEDERATED_STORAGE_ENGINE=1 \
  32. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  33. -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
  34. -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
  35. -DWITH_FAST_MUTEXES=1 \
  36. -DWITH_ZLIB=bundled \
  37. -DENABLED_LOCAL_INFILE=1 \
  38. -DWITH_READLINE=1 \
  39. -DWITH_EMBEDDED_SERVER=1 \
  40. -DWITH_DEBUG=0
  41. #-- Build files have been written to: /home/oldsuo/tools/mysql-5.5.32
  42. 提示: 编译时可配置的选项很多,具体可参考结尾附录或官方文档:
  43. make
  44. #[100%] Built target my_safe_process
  45. make install
  46. ln -s /application/mysql-5.5.32/ /application/mysql
  47. 如果上述操作未出现错误,则MySQL5.5.32软件cmake方式的安装就算成功了。
  48. #拷贝配置文件
  49. cp mysql-5.5.32/support-files/my-small.cnf /etc/my.cnf
  50. #添加变量,并使之生效
  51. echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
  52. source /etc/profile
  53. echo $PATH
  54. #授权用户及/tmp/临时文件目录
  55. chown -R mysql.mysql /application/mysql/data/
  56. chmod -R 1777 /tmp/
  57.  
  58. #初始化数据库
  59. cd /application/mysql/scripts/
  60. ./mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql
  61. cd ../
  62.  
  63. #启动数据库
  64. cp support-files/mysql.server /etc/init.d/mysqld
  65. chmod +x /etc/init.d/mysqld
  66. /etc/init.d/mysqld start
  67. #检查端口
  68. netstat -lntup|grep 3306

 编译安装完后一般安全操作:

 1、删除不必要的用户和库:

  1. #查看用户和主机列,从mysql.user里查看
  2. select user,host from mysql.user;
  3. #删除用户名为空的库,并检查
  4. delete from mysql.user where user='';
  5. select user,host from mysql.user;
  6. #删除主机名为localhost.localdomain的库,并检查
  7. delete from mysql.user where host='localhost.localdomain';
  8. select user,host from mysql.user;
  9. #删除主机名为::1的库,并检查。::1库的作用为IPV6
  10. delete from mysql.user where host='::1';
  11. #删除test库
  12. drop database test;

2、添加额外管理员:

  1. # 添加额外管理员,system作为管理员,oldsuo为密码
  2. mysql> delete from mysql.user;
  3. Query OK, 2 rows affected (0.00 sec)
  4. mysql> grant all privileges on *.* to system@'localhost' identified by 'oldsuo' with grant option;
  5. Query OK, 0 rows affected (0.00 sec)
  6. # 刷新MySQL的系统权限相关表,使配置生效
  7. mysql> flush privileges;
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql> select user,host from mysql.user;
  10. +--------+-----------+
  11. | user | host |
  12. +--------+-----------+
  13. | system | localhost |
  14. +--------+-----------+
  15. 1 row in set (0.00 sec)
  16. mysql>

3、设置登录密码并开机自启:

  1. #设置密码,并登陆
  2. /usr/local/mysql/bin/mysqladmin -u root password 'oldsuo'
  3. mysql -usystem -p
  4. #开机启动mysqld,并检查
  5. chkconfig mysqld on
  6. chkconfig --list mysqld

 

  1. #安装依赖包
  2. yum y install ncurses ncurses-devel gcc gcc-c++
  3.  
  4. #添加mysql用户及组
  5. groupadd mysql
  6. useradd -r -s /sbin/nologin -g mysql mysql
  7. #mysql5.1.62编译参数:
  8. ./configure \
  9. --prefix=/usr/local/mysql \
  10. --with-unix-soket-path=/usr/local/tmp/mysql.sock \
  11. --localstatedir=/usr/local/mysql/data \
  12. --enable-assembler \
  13. --enable-thread-safe-client \
  14. --with-mysqld-user=mysql \
  15. --with-big-tables \
  16. --without-debug \
  17. --with-pthread \
  18. --enable-assembler \
  19. --with-extra-charsets=complex \
  20. --with-readline \
  21. --with-ssl \
  22. --with-embedded-server \
  23. --enable-local-infile \
  24. --with-plugins=partition,innobase \
  25. --with-mysqld-ldflags=-all-static \
  26. --with-client-ldflags=-all-static
  27. make && make install
  28. #初始化mysql
  29. mkdir -p /usr/local/mysql/data #建立mysql数据文件目录
  30. chown -R mysql.mysql /usr/local/mysql/ #授权mysql用户访问mysql安装目录
  31. /usr/local/mysql/bin/mysql_install_db --user=mysql #初始化
  32.  
  33. #拷贝mysql启动脚本
  34. cp support-files/my-small.cnf /etc/my.cnf
  35. #cp support-files/mysql.server /etc/init.d/mysqld
  36. chmod 700 /etc/init.d/mysqld
  37. #配置mysql使用全局路径
  38. echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile #添加变量到profile
  39. source /etc/profile #使变量生效
  40. echo $PATH #检查
  41.  
  42. #启动mysqld
  43. /etc/init.d/mysqld start
  44. #登陆报错,做软链接
  45. #ln -s /usr/local/mysql/bin/mysql /usr/bin/
  46.  
  47. #启动报错日志: Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't #exist
  48. #解决方法: /usr/local/mysql/bin/mysql_install_db --user=mysql #初始化数据库即可
  49.  
  50. #登陆报错: mysql: unknown variable 'datadir=/usr/local/mysql/data'
  51. #解决方法: my.cnf 配置问题,vim /etc/my.cnf
  52. [client]
  53. #password = your_password
  54. port = 3306
  55. socket = /tmp/mysql.sock
  56. #datadir = /data1/mysql/var/ #这个不能加在上面,去掉
  57. [mysqld]
  58. port = 3306
  59. socket = /tmp/mysql.sock
  60. datadir = /data1/mysql/var/ #加在这里就可以了
  61.  
  62.  
  63. #设置mysql用户root 的密码为oldsuo
  64. /usr/local/mysql/bin/mysqladmin -u root password 'oldsuo'
mysql5.1.62安装编译

 

 三、字符集

 对于新手来说,字符集乱码问题无疑是头痛的问题,小编就带你不在头痛,从此幸福。

1、字符集简介:

字符集,character set,就是一套表示字符的符号和这些的符号的底层编码;而校验规则,则是在字符集内用于比较字符的一套规则。简单的说,字符集就是一套文字符号及其编码、比较规则的集合,第一个计算机字符集ASC2,MySQL数据库字符集包括字符集和校对规则两个概念,字符集是定义数据库里面的内容字符串的存储方式,而校对规则是定义比较字符串的方式。

建议:中英文环境选择utf8

2、查看设置字符集

  1. # 查看MySQL字符集设置情况
  2. show variables like 'character_set%';
  3. # 查看库的字符集
  4. show create database db;
  5. # 查看表的字符集
  6. show create table db_tb\G
  7. # 查询所有
  8. show collation;
  9. # 设置表的字符集
  10. set tables utf8;
  1. show create database nick_defailt\G #查看nick_defailt库字符集
  2. mysql -uroot -p -e "SHOW CHARACTER SET;"
  3. show variables like 'character_set%';
  4. mysql> show variables like 'character_set%';
  5. +-----------------------------------------+------------------------------------------------------------+
  6. | Variable_name | Value |
  7. +----------------------------------------+-------------------------------------------------------------+
  8. | character_set_client | utf8 |
  9. | character_set_connection | utf8 |
  10. | character_set_database | utf8 |
  11. | character_set_filesystem | binary |
  12. | character_set_results | utf8 |
  13. | character_set_server | utf8 |
  14. | character_set_system | utf8 |
  15. | character_sets_dir | /usr/local/mysql/share/mysql/charsets/ |
  16. +----------------------------------------+--------------------------------------------------------------+
  17. 8 rows in set (0.00 sec)
  18. mysql> show create database nick_defailt \G
  19. *************************** 1. row ***************************
  20. Database: data
  21. Create Database: CREATE DATABASE `data` /*!40100 DEFAULT CHARACTER SET utf8 */
  22. 1 row in set (0.00 sec)
View Code

3、MySQL数据乱码及解决方法

  1. 1> 系统方面
  2. cat /etc/sysconfig/i18n
  3. LANG="zh_CN.UTF-8"
  4.  
  5. 2> 客户端(程序),调整字符集为latin1
  6. mysql> set names latin1; #临时生效
  7. Query OK, 0 rows affected (0.00 sec)
  8. #更改my.cnf客户端模块的参数,实现set name latin1 的效果,并且永久生效。
  9. [client]
  10. default-character-set=latin1
  11. #无需重启服务,退出登录就生效,相当于set name latin1。
  12.  
  13. 3> 服务端,更改my.cnf参数
  14. [mysqld]
  15. default-character-set=latin1 #适合5.1及以前版本
  16. character-set-server=latin1 #适合5.5
  17.  
  18. 4> 库、表、程序
  19. #建表指定utf8字符集
  20. mysql> create database nick_defailtsss DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  21. Query OK, 1 row affected (0.00 sec)

4、将utf8字符集修改成GBK字符集的实际过程

  1. 1> 导出表结构
  2. #以utf8格式导出
  3. mysqldump -uroot -p --default-character-set=utf8 -d nick_defailt>alltable.sql
  4. --default-character-set=gbk #表示已GBK字符集连接 –d 只表示表结构
  5.  
  6. 2> 编辑alltable.sql utf8改成gbk
  7. 3> 确保数据库不在更新,导出所有数据
  8. mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=utf8 nick_defailt>alldata.sql
  9. 4> 打开alldata.sqlset name utf8 修改成 set names gbk(或者修改系统的服务端和客户端)
  10. 5> 建库
  11. create database oldsuo default charset gbk;
  12. 6> 创建表,执行alltable.sql
  13. mysql -uroot -p oldsuo <alltable.sql
  14. 7> 导入数据
  15. mysql -uroot -p oldsuo <alltable.sql

 

 四、存储引擎

MySQL最常用存储引擎Myisam和Innodb。mysql 5.5.5以后默认存储引擎为Innodb。

MySQL的每种引擎在MySQL里是通过插件的方式使用的,MySQL可以支持多种存储引擎。

建议:使用 Innodb引擎,因为支持回滚,后续博客会讲。

1、引擎对应系统文件

  1. 1) MyISAM引擎系统库表对应文件
  2. [root@mysql 3306]# ll /data/3306/data/mysql/
  3. -rw-rw----. 1 mysql mysql 10630 10 31 16:05 user.frm #保存表的定义
  4. -rw-rw----. 1 mysql mysql 1140 10 31 18:40 user.MYD #数据文件
  5. -rw-rw----. 1 mysql mysql 2048 10 31 18:40 user.MYI #索引文件
  6. [root@mysql 3306]# file data/mysql/user.frm
  7. data/mysql/user.frm: MySQL table definition file Version 9
  8. [root@mysql 3306]# file data/mysql/user.MYD
  9. data/mysql/user.MYD: DBase 3 data file (167514107 records)
  10. [root@mysql 3306]# file data/mysql/user.MYI
  11. data/mysql/user.MYI: MySQL MISAM compressed data file Version 1
  12.  
  13. 2) InnoDB引擎
  14. [root@mysql 3306]# ll data/
  15. -rw-rw----. 1 mysql mysql 134217728 10 31 20:05 ibdata1

2、修改引擎

  1. 创建后引擎的修改
  2. 语法: ALTER TABLE student ENGINE = INNODB;
  3. ALTER TABLE student ENGINE = MyISAM;
  1. mysql> use teacher;
  2. Database changed
  3. mysql> show create table student;
  4. +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | Table | Create Table |
  6. +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  7. | student | CREATE TABLE `student` (
  8. `id` int(4) NOT NULL AUTO_INCREMENT,
  9. `name` char(20) NOT NULL,
  10. `age` tinyint(2) NOT NULL DEFAULT '0',
  11. `dept` varchar(16) DEFAULT NULL,
  12. PRIMARY KEY (`id`),
  13. KEY `index_name` (`name`)
  14. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
  15. +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  16. 1 row in set (0.01 sec)
  17. mysql> ALTER TABLE student ENGINE = MyISAM;
  18. Query OK, 3 rows affected (0.05 sec)
  19. Records: 3 Duplicates: 0 Warnings: 0
  20. mysql> show create table student;
  21. +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  22. | Table | Create Table |
  23. +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  24. | student | CREATE TABLE `student` (
  25. `id` int(4) NOT NULL AUTO_INCREMENT,
  26. `name` char(20) NOT NULL,
  27. `age` tinyint(2) NOT NULL DEFAULT '0',
  28. `dept` varchar(16) DEFAULT NULL,
  29. PRIMARY KEY (`id`),
  30. KEY `index_name` (`name`)
  31. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
  32. +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  33. 1 row in set (0.00 sec)
修改实例

3、建表指定引擎

  1. mysql> create table mess (
  2. -> id int(4) not null,
  3. -> name char(20) not null,
  4. -> age tinyint(2) NOT NULL default '0',
  5. -> dept varchar(16) default NULL
  6. -> ) ENGINE=MyISAM CHARSET=utf8;
  7. Query OK, 0 rows affected (0.00 sec)

 

 五、基本语句命令

 运行相关:

  1. 1 单实例mysql启动
  2. [root@localhost ~]# /etc/init.d/mysqld start
  3. Starting MySQL [确定]
  4. #mysqld_safe –user=mysql &
  5.  
  6. 2 查看MySQL端口
  7. [root@localhost ~]# ss -lntup|grep 3306
  8. tcp LISTEN 0 50 *:3306 *:* users:(("mysqld",19651,10))
  9. 3 查看MySQL进程
  10. [root@localhost ~]# ps -ef|grep mysql|grep -v grep
  11. root 19543 1 0 Oct10 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
  12. mysql 19651 19543 0 Oct10 ? 00:05:04 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --log-error=/usr/local/mysql/data/localhost.localdomain.err --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/tmp/mysql.sock --port=3306
  13.  
  14. 4 MySQL启动原理
  15. /etc/init.d/mysqld 是一个shell启动脚本,启动后最终会调用mysqld_safe脚本,最后调用mysqld服务启动mysql
  16. "$manager" \
  17. --mysqld-safe-compatible \
  18. --user="$user" \
  19. --pid-file="$pid_file" >/dev/null 2>&1 &
  20.  
  21. 5、关闭数据库
  22. [root@localhost ~]# /etc/init.d/mysqld stop
  23. Shutting down MySQL.... [确定]
  24. 6 查看mysql数据库里操作命令历史
  25. cat /root/.mysql_history
  26. 7 强制linux不记录敏感历史命令
  27. HISTCONTROL=ignorespace
  28. 8 mysql设置密码
  29. /usr/local/mysql/bin/mysqladmin -u root password 'oldsuo'
  30.  
  31. 9 mysql修改密码,与多实例指定sock修改密码
  32. mysqladmin -uroot -passwd password 'oldsuo'
  33. mysqladmin -uroot -passwd password 'oldsuo' -S /data/3306/mysql.sock

操作相关:

  1. #登陆mysql数据库
  2. mysql -uroot p
  3. #查看有哪些库
  4. show databases;
  5. #删除test库
  6. drop database test;
  7. #使用test库
  8. use test;
  9. #查看有哪些表
  10. show tables;
  11. #查看suoning表的所有内容
  12. select * from suoning;
  13. #查看当前版本
  14. select version();
  15. #查看当前用户
  16. select user();
  17. #查看用户和主机列,从mysql.user里查看
  18. select user,host from mysql.user;
  19. #删除前为空,后为localhost的库
  20. drop user ""@localhost
  21. #刷新权限
  22. flush privileges;
  23. #跳出数据库执行命令
  24. system ls;

 

 六、破解mysql登录密码

忘记mysql登录密码也是一件头疼的事,那幺小编会让你继续幸福。

  1. 1> 普通方式
  2. #> service mysqld stop
  3. #>mysqld_safe --skip-grant-tables &
  4. 输入 mysql -uroot -p 回车进入
  5. >use mysql;
  6. > update user set password=PASSWORD("newpass")where user="root";
  7. 更改密码为 newpassord
  8. > flush privileges; 更新权限
  9. > quit 退出
  10. service mysqld restart
  11. mysql -uroot -p新密码进入
    2> 普通方式的简写
  12. service mysqld stop
  13. mysqld_safe --skip-grant-tables --user=mysql &
  14. mysql
  15. update mysql.user set password=PASSWORD("newpass")where user="root" and host='localhost';
  16. flush privileges;
  17. mysqladmin -uroot -pnewpass shutdown
  18. /etc/init.d/mysqld start
  19. mysql -uroot -pnewpass #登陆
  20.  
  21. 3>多实例方式
  22. killall mysqld
  23. mysqld_safe defaults-file=/data/3306/my.cnf skip-grant-table &
  24. mysql u root p S /data/3306/mysql.sock #指定sock登陆
  25. update mysql.user set password=PASSWORD("newpass")where user="root";
  26. flush privileges;
  27. mysqladmin -uroot -pnewpass shutdown
  28. /etc/init.d/mysqld start
  29. mysql -uroot -pnewpass #登陆

 

 注:本文有看不懂的在后续博客有详解


还没有评论.