Linux MYSQL 数据库
Linux MYSQL数据库1.1.概述:DBMS datebase management system数据库管理系统DML:date manapulate lanaguage数据操作语言
INSERT,REPLACE,UPDATE,DELETE
DLL: Date Defination Lanauage 数据定义语言
CREATE,创建数据库 ALTER,修改数据库 DROP 删除数据库和表
DCL:Date Control Language 数据控制语言
常用数据库软件
[*]Oracle 世界三大
[*]Sybase
[*]Infomix
[*]SQL Server sybase和micrsoft共同开发
[*]MySQL
[*]PostgreSQL
[*]pgsql
[*]EnterpriseDB redhat注资
MySQL,SQL 瑞典 MySQL AB 作者女儿名字命名
MYSQL事务工作原理:可以能保证你做的一系列动作,要么全部成功。如果有一个操作失败,就回退到修改前。 比如你要做下面几个操作:1.删除表A中的某些记录;2.向B添加一些记录;3.修改C表中的一些数据;-------------------------使用事务,如果1,2都成功了,3却失败了。就会回退到第1步执行前的样子,ABC表都没被修改。
1.2.索引
表索引:相当于一个表的目录 可以加快速度访问1) 普通索引2) 唯一索引3) 主索引4) 外键索引5) 复合索引
# 数据库文件路径mysql> show variables link '%datadir%';
1.3.mysql安装
1.3.1.mysql源码安装
wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gztar xzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ./configure --prefix=/usr/local/mysql--enable-assembler && make -j8 &&make -j8 install
--enable-assembler # 使用某些字符串的汇编器版本
安装报错: checkingfor termcap functions library... configure: error: No curses/termcap libraryfound解决方法: yum install ncurses-devel-y
1. 设置服务配置MYSQL服务为系统服务
cp/usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cp/usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld
2. 设置开机启动chkconfig --add mysqld # 增加服务chkconfig --level 345 mysqld on # 增加开机项3. 建立系统账号
useradd mysql
4. 过入mysql安装目录cd /usr/local/mysql
chown -R mysql.mysql/usr/local/mysql # 将安装目录所有者权限设为mysql用户
/usr/local/mysql/bin/mysql_install_db--user=mysql --datadir=/usr/local/mysql/var --basedir=/usr/local/mysql # 初始化数据库 --datadir=指定数据目录 --basedir=指定数据基础目录
chown -R mysql.mysql var # 修改var所有者
/usr/local/mysql/bin/mysqld_safe --user=mysql & # 服务后台启动
5.5以上版本安装方式:
rm -rf /data/mysql/*
scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql--user=mysql
bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
安装依赖:yum -yinstall gcc-c++ cmake ncurses-devel
useradd mysql
mkdir -p /data/mysqlchown -R mysql:mysql /data/mysql
cmake .-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \-DMYSQL_DATADIR=/data/mysql \-DSYSCONFDIR=/etc \-DMYSQL_USER=mysql \-DMYSQL_TCP_PORT=3306 \-DWITH_XTRADB_STORAGE_ENGINE=1 \-DWITH_INNOBASE_STORAGE_ENGINE=1 \-DWITH_PARTITION_STORAGE_ENGINE=1 \-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \-DWITH_MYISAM_STORAGE_ENGINE=1 \-DWITH_READLINE=1 \-DENABLED_LOCAL_INFILE=1 \-DWITH_EXTRA_CHARSETS=1 \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_ci \-DEXTRA_CHARSETS=all \-DWITH_BIG_TABLES=1 \-DWITH_DEBUG=0
&& make && make install
初始化cd /usr/local/mysql./scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysql --datadir=/data/mysql
添加服务cp ./support-files/mysql.server/etc/rc.d/init.d/mysqldchmod 755 /etc/init.d/mysqldchkconfig mysqld on
修改启动服务vi /etc/rc.d/init.d/mysqldbasedir=/usr/local/mysqldatadir=/data/mysql:wq!
修改配置文件vim /etc/my.cnfdatadir=/data/mysql:wq
service mysqld start
添加环境变量vi /etc/profileexport PATH=$PATH:/usr/local/mysql/bin:wq!
添加socksource /etc/profileln -s /var/lib/mysql/mysql.sock /tmp/
安装报错: Curses library not found.Please install appropriate package,
按照错误提示,Debian/Ubuntu下需要安装libncurses5-dev;Redhat下需要安装ncurses-devel ,检查是否安装了ncurses包,如下所示,已经安装了ncurses-5.5-24.20060715,但是缺少ncurses-devel包。
yum install ncurses-devel -y
安装了ncurses-devel包后,删除CMakeCache.txt,然后重新编译,编译成功,问题解决!
预编译:cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/-DMYSQL_DATADIR=/home/mysql/data/ -DEFAULT_CHARSET=utf8 -DMYSQL_TCP_PORT=3306-DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DWITH_DEBUG=0 -DWITH_INNOBASE_STORAGE_ENGINE=1-DMYSQL_USER=mysql
make && make install
这些参数的意思:
-DCMAKE_INSTALL_PREFIX=/data/mysql 准备安装到那里
-DEFAULT_CHARSET=utf8 默认的字符集
-DMYSQL_TCP_PORT=3306 数据库的监听端口
-DMYSQL_UNIX_ADDR=/tmp/mysql3306.sock 本机连回数据库的unix socket
-DWITH_DEBUG=0 关闭debug模式
-DWITH_INNOBASE_STORAGE_ENGINE=1 打开innodb引擎
项目删除:CMake 默认不提供uninstall 这个 target,想要的话,输入:
xargs rm < install_manifest.txt
1.3.2.Yum安装yuminstall -ymysql mysql-devel mysql-server mysql-libs
安装依赖包-----------------------------------------------------------------------------------------------------------------------------Installing: mysql-server i686 5.1.73-5.el6_7.1 updates 8.8 MInstalling for dependencies: mysql i686 5.1.73-5.el6_7.1 updates 904 k perl-DBD-MySQL i686 4.013-3.el6 base 134 k perl-DBI i686 1.609-4.el6 base 705 kUpdating for dependencies: mysql-libs i686 5.1.73-5.el6_7.1 updates 1.2 M---------------------------------------------------------------------------------------------------------------------------------
二进制程序:mysqlmysqld 可执行程序
RDBMS: /var/lib/mysql/ 数据库默认路径
yum install mysql-server -y
初始化mysql: 首次安装会自动初始化
1.4.服务与端口
service mysqlrestartservice mysqldrestart# 重启和停止服务/etc/init.d/mysqld stop
端口tcp:3306
/usr/local/mysql/share/mysql.server stop –socket=/var/lib/mysql/mysql.sock&启动后台服务
/usr/loacl/mysql/bin/mysql/mysql.serverstop 停止源码mysql服务
1.5.配置文件 /etc/my.conf // 服务器端配置 datadir=/data/mysql // 数据目录 socket=/var/lib/mysql/mysql.sock //socket // 通信设置 user=mysql // 使用mysql用户启动symbolic-links=0 // 是否支持快捷方式 log-bin=mysql-bin // 开启bin-log日志 server-id = 1 // mysql服务ID auto_increment_offset=1 // 1~65535 自增长字段 auto_increment_increment=2 // 1~65535 自增长字段每次递增的量 默认为1(mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,而要把auto_increment_offset分别配置为1和2,这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。) // mysql服务安全启动配置 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid replicate-do-db =jfedu // 允许slave同步哪个库 key_buffer_size=16M 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。一般为内存的50% show variables like ‘key_buffer_size‘;查询缓冲大小max_connections = 3000 # 每个客户端连接最大的错误允许数量,如果达到了此限制,这个客户端将会被MySQL服务阻止直到执行了”FLUSHHOSTS”或者服务重启.innodb_buffer_pool_size= 对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。内存32G,24G根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。basedir =path # 使用给定目录作为根目录(安装目录)。datadir =path #从给定目录读取数据库文件。pid-file = filename # 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); socket = /tmp/mysql.sock # 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件)port = 3306 # 指定MsSQL侦听的端口 key_buffer = 384M # key_buffer是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写)。索引块是缓冲的并且被所有的线程共享,key_buffer的大小视内存大小而定。table_cache = 512 # 为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。可以避免频繁的打开数据表产生的开销sort_buffer_size = 2M # 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MBread_buffer_size = 2M # 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。query_cache_size = 32M # 指定MySQL查询结果缓冲区的大小read_rnd_buffer_size = 8M # 改参数在使用行指针排序之后,随机读用的。myisam_sort_buffer_size = 64M # MyISAM表发生变化时重新排序所需的缓冲thread_concurrency = 8 # 最大并发线程数,取值为服务器逻辑CPU数量×2,如果CPU支持H.T超线程,再×2thread_cache = 8 # #缓存可重用的线程数skip-locking # 避免MySQL的外部锁定,减少出错几率增强稳定性。 max_allowed_packet =16M # 服务器和客户端之间最大能发送的可能信息包
1.6.客户端连接
# 查询当前连接进程
showprocesslist;
[*]访问mysql的命令格式:
mysql: -uusername 默认root -p 默认 空-hmyser_server 默认 loclhost本机
示例:mysql -uroot -p -h 192.168.1.254
退出\q
连接方式: linuxsocket server和clinet在同一台服务器 windowsmemory共享内存 网络端TCP
mysql 客户端:
交互式模式 批处理模式
交互式模式中的命令类别: 客户端命令 : \h帮助菜单 服务器端命令 语句结束符: 默认为分号;
1.7.数据类型
关系数据库对象: 库 表 索引 视图 键(约束) 存储过程 存储函数 触发器 游标 用户 权限 事务
表: 行row列 field ,column 字段 数据类型类型修饰(限制)
数值类型整数类型 字节 范围(有符号) 范围(无符号) 用途 TINYINT 1字节 (-128,127) (0,255) 小整数值 SMALLINT 2字节 (-32 768,32 767) (0,65 535) 大整数值 MEDIUMINT 3字节 (-8 388608,8 388 607) (0,16 777 215) 大整数值 INT或INTEGER 4字节 (-2147 483 648,2 147 483 647) (0,4294 967 295) 大整数值 BIGINT 8字节 (-9 233 372 036854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 FLOAT 4字节 (-3.402 823 466E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823466 E+38) 单精度浮点数值 DOUBLE 8字节 (1.797 693 134 862 3157 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
字符串类型字符串类型 字节大小 描述及存储需求 CHAR 0-255字节 定长字符串 VARCHAR 0-255字节 变长字符串 TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串 TINYTEXT 0-255字节 短文本字符串 BLOB 0-65535字节 二进制形式的长文本数据 TEXT 0-65535字节 长文本数据 MEDIUMBLOB 0-16 777215字节 二进制形式的中等长度文本数据 MEDIUMTEXT 0-16 777215字节 中等长度文本数据 LOGNGBLOB 0-4294 967 295字节 二进制形式的极大文本数据 LONGTEXT 0-4294 967 295字节 极大文本数据 VARBINARY(M) 允许长度0-M个字节的定长字节符串,值的长度+1个字节 BINARY(M) M 允许长度0-M个字节的定长字节符串
日期和时间类型类型 大小(字节) 范围 格式 用途 DATE 4 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间 YEAR 1 1901/2155 YYYY 年份值 DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值 TIMESTAMP4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
1.8.Mysql 软件管理
1.8.1.修改mysql字符集为UTF-8的方法:show variables like "%char%"
在/etc/my.cnf对应如下配置段加入相应命令字段加入default-character-set=utf8 客户端生效
字段加入character-set-server=utf8
字段里加入default-character-set=utf8 本地生效
然后重启mysql服务
1.8.2.Mysql常用的两大引擎:MyISAM和InnoDB
MyISAM MySQL5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务,支持表锁不支持行锁;InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎;BDB源自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性;Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失;Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合使用什么引擎呢?MyISAM 类型的表强调的是性能,其执行数度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT(查询)操作,MyISAM是更好的选择,支持表锁。InnoDB 提供事务支持事务,外部键等高级数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
表锁和行锁:表锁,指当你插入数据时,其它命令不能插入和操作 行锁,如果要插入一行数据时,会锁定当前行,其它行不影响
1.8.3.查看表使用的引擎:showcreate table test_t0;
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT(查询)操作,MyISAM是更好的选择,支持表锁。InnoDB提供事务支持事务,外部键等高级数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
1.8.4.修改MySQL表空间引擎:设置InnoDB为默认引擎:在配置文件my.cnf中的 下面加入default-storage-engine=INNODB 然后重启mysqld服务即可。
修改表引擎方法如下:altertable t1 engine=myisam;
alter table t1 engine=innodb;
如果添加innodb引擎报错,需要执行如下命令:删除/mysql/data目录下的ib_logfile0,ib_logfile1文件即可。
1.8.5.创建索引命令Alter table用来创建普通索引、unique索引或primary key索引。(我这里以t1表为例来讲解)alter table t1 add index index_name (name)alter table t1 add unique (name)alter table t1 add primary key (name)或者使用create创建create index index_name on t1 (name)create unique index index_name on t1 (name)删除索引drop index index_name on talbe_namealter table t1 drop index index_name
1.8.6.MySQL慢查询1) 查看当前mysql慢查询状态show variables like "%slow%";| log_slow_queries | OFF| slow_launch_time | 2 |超过2秒定义为慢查询。| slow_query_log | OFF |慢查询关闭状态。| slow_query_log_file |/data/mysql/var/db-Test2-slow.log | 慢查询日志的文件。
2) 开启慢查询日志方法临时开启:set globalslow_query_log=on;永久开启: 在my.cnf中添加,如下:log-slow-queries = /data/mysql/var/db-Test2-slow.log #日志目录。开启慢日志查询long_query_time = 0.1 #记录下查询时间查过1秒。log-queries-not-using-indexes#表示记录下没有使用索引的查询。
3) mysqldumpslow分析日志可用mysql提供的mysqldumpslow,使用很简单,参数可-help查看 -s:排序方式。c , t , l , r 表示记录次数、时间、查询时间的多少、返回的记录数排序;# ac , at , al , ar 表示相应的倒叙;# -t:返回前面多少条的数据;# -g:包含什么,大小写不敏感的;
mysqldumpslow-s r -t 10 /data/mysql/var/db-Test2-slow.log
1.8.7. MySQL数据库配置并发优化
Mysql的优化:一般分为配置的优化、sql语句的优化、表结构的优化、索引的优化,而配置的优化:一般包括系统内核优化、mysql本身配置文件的优化。
1.8.7.1.MySQL常见的优化参数详解:l硬件上的优化:增加内存和提高磁盘读写速度,都可以提高MySQL数据库的查询,更新的速度。另一种提高MySQL性能的方式是使用多块磁盘来存储数据。因为可以从多块磁盘上并行读取数据,这样可以提高读取数据的速度。
[*]MySQL参数的优化:
内存中会为MySQL保留部分的缓冲区。这些缓冲区可以提高MySQL的速度。缓冲区的大小都是在MySQL的配置文件中进行设置的。下面对几个重要的参数进行详细介绍:1)key_buffer_size:表示索引缓存的大小。这个值越大,使用索引进行查询的速度就越快。配置内存的80%2)table_cache:表示同时打开的表的个数。这个值越大,能同时打开的表的个数就越多。这个值不是越大越好,因为同时打开的表过多会影响操作系统的性能。3)query_cache_size:表示查询缓冲区的大小。使用查询缓存区可以提高查询的速度。这个方式只使用与修改操作少且经常执行相同的查询操作的情况;默认值是0。 4)Query_cache_type:表示查询缓存区的开启状态。0表示关闭,1表示开启。5)Max_connections:表示数据库的最大连接数。这个连接数不是越大越好,因为连接会浪费内存的资源。参考值为10006)sort_buffer_size:排序缓存区的大小,这个值越大,排序就越快。7)Innodb_buffer_pool_size:表示InnoDB类型的表和索引的最大缓存。这个值越大,查询的速度就会越快。这个值太大了就会影响操作系统的性能。内存的80%
附一个真实环境MySQL配置my.cnf内容,可以根据实际情况修改:
port = 3306
socket = /tmp/mysql.sock
user = mysql
server_id = 10
port = 3306
socket = /tmp/mysql.sock
datadir = /data/mysql/data1
old_passwords = 1
lower_case_table_names = 1
character-set-server = utf8
default-storage-engine = MYISAM
log-bin = bin.log
log-error = error.log
pid-file = mysql.pid
long_query_time = 2
slow_query_log
slow_query_log_file = slow.log
binlog_cache_size = 4M
binlog_format = mixed
max_binlog_cache_size = 16M
max_binlog_size = 1G
expire_logs_days = 30
ft_min_word_len = 4
back_log = 512
max_allowed_packet = 64M
max_connections = 4096
max_connect_errors = 100
join_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 2M
sort_buffer_size = 2M
query_cache_size = 64M
table_open_cache = 10000
thread_cache_size = 256
max_heap_table_size = 64M
tmp_table_size = 64M
thread_stack = 192K
thread_concurrency = 24
local-infile = 0
skip-show-database
skip-name-resolve
skip-external-locking
connect_timeout = 600
interactive_timeout = 600
wait_timeout = 600
#*** MyISAM
key_buffer_size = 512M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 1G
myisam_repair_threads = 1
concurrent_insert = 2
myisam_recover
#*** INNODB
innodb_buffer_pool_size = 16G
innodb_additional_mem_pool_size =32M
innodb_data_file_path =ibdata1:1G;ibdata2:1G:autoextend
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 120
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_thread_concurrency = 16
innodb_open_files = 10000
#innodb_force_recovery = 4
#*** Replication Slave
read-only
#skip-slave-start
relay-log = relay.log
log-slave-updates
1.8.8.MySQL版本查询# mysql -Vmysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (i386) using readline 5.1#
1.8.9.Mysql管理软件phpmyadmin navicathttp://www.phpmyadmin.net/downloads/
安装phpMyAdmin,一个客户端管理工具1、到官网下载phpMyAdmin-3.5.2.2-all-languages.tar.gz2、解压 tar -zxvfphpMyAdmin-3.5.2.2-all-languages.tar.gz 3、将解压后的文件夹重命名为phpMyAdmin,放到apache的站点目录下4、在浏览器中输入http://localhost/phpMyAdmin/index.php即可看到管理界面了。
需要支持php5.5以上版本
配置文件/var/www/html/mysql/libraries/config.default.php
$cfg['PmaAbsoluteUri'] = ''; # 这里填写phpMyAdmin 的访问网址
$cfg['Servers'][$i]['host'] ='localhost'; # 服务器IP或127.0.0.1不能使用localhost
$cfg['Servers'][$i]['port'] =''; # 默认端口3306
$cfg['Servers'][$i]['user'] ='root'; # 默认用户名
fg['Servers'][$i]['password'] =''; # 密码
$cfg['Servers'][$i]['auth_type'] ='cookie'; # 验证类型
四种模式可供选择,cookie,http,HTTP,config config方式即输入 phpMyAdmin 的访问网址即可直接进入,无需输入用户名和密码当该项设置为 cookie,http 或 HTTP 时,登录 phpMyAdmin 需要数据用户名和密码进行验证,具体如下: PHP 安装模式为 Apache,可以使用 http 和cookie; PHP 安装模式为 CGI,可以使用 cookie。
[*]错误提示:
修改配置文件中:$cfg['Servers'][$i]['host'] = 'localhost';更换成$cfg['Servers'][$i]['host'] = '127.0.0.1';
[*]错误提示:
phpmyadmin提示:The mbstring extension is missing. Pleasecheck your PHP configuration
yuminstall php-mbstring –y
The mysqliextension is missing. Please check your PHP configuration. See our documentation formore information.安装yum install php-mysql –y
php增加mysqli扩展正在运行的php上增加mysqli扩展,基本方法与加载其他扩展一样,就是不用再单独下载扩展包了,php安装包里就自带,找到你当前php运行的版本,我的是php-5.2.10,具体方法如下:
tar -zxf php-5.2.10.tar.gz
cd php-5.2.10/ext/mysqli
/usr/local/php/bin/phpize ##生成configur文件
./configure–with-php-config=/usr/local/php/bin/php-config–with-mysqli=/usr/local/mysql/bin/mysql_config ##这里可能会不一样,根据你php和mysql的安装路径而定。
make
make install##完成后有以串路径,把他复制下来,一会要用,我的返回是/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613
vi /usr/local/php/lib/php.ini ##php.ini这里可能也会不一样,有的会在/usr/local/php/etc下,也有在/etc下的。
在最后一行加入如下字段
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/mysqli.so
其中mysqli.so前边的路径就是make install后返回的路径
重启php服务或是apache服务,我这里是apache
/etc/init.d/httpd restart
在php-5.2.10/ext中有很多这样的模块,都可以用以上方法实现。
1.8.10.重新初始数据库/usr/local/mysql/bin/mysql_install_db--user=mysql --datadir=/usr/local/mysql/var --basedir=/usr/local/mysql # 初始化数据库 --datadir=指定数据目录 --basedir=指定数据基础目录
1.8.11.修改mysql用户密码
Mysqladmin –urootpassword “123456”update user set password=password("123456")where user='root';flush privileges;
1.9.Mysql 数据库管理
1.9.1.创建数据库Create Database
create database db_name;
create database if not exists db_name 如果不存在就创建,不报错
1.9.2.查看数据库Show Databases show databases;
1.9.3.删除数据库Drop Database
drop datebase db_name; 注:删除无法恢复
Drop database bbs; # 删除bbs数据库
1.10.Mysql 数据表操作
1.10.1.创建表:Createtable tb_name (字段名 数据类型) use mydb # 使用哪个库类型于sql中先选择数据库名 create table tb_name(col1,col2,...字段名)
create table tb_name(col1,col2,...字段名) type=inodb# 创建数据库并指定引擎
例:createtable students(name char(20) not null, age char(10) unsigned,sex char(10)not null);
NameAgesex
1.10.2.查看表: showtables 查看库中的表:show tables; 查年表中的结构: desc tabale_name;
1.10.3.删除表: Droptable tb_name drop table tb_name;
droptable bbs; # 删除bbs表1.10.4.修改表:Altertable …………. alter table tb_name;
[*]修改 modify 改属性改数据类型
[*]改变 change 改值 改名称
[*]增加 add
[*]删除 drop
[*]增加:add
语法格式: alter table students add 字段名varchar(100) # 添加字段名指定数据类型varchar 实例: alter talbe students add telphone int(20);# 修改students表增加telphone列,
[*]修改值:change
例: ALTER TABLE students CHANGE “原字段1“ ”现字段2“ VARCHAR(100) AFTER Name; # 修改”原字段1”的字段名和类型,添加到Nmae字符之后 # 要指定源字段,新字段,新类型
[*]修改属性:modify
例: alter tableusers modify tel text(10); # 修改tel字段的字段类型
[*]删除列: drop
例:altertable user drop id; # 删除user表中的id列1.10.5.清空表:deletefrom tables
# 清空表的内容delect from jf_t1;
1.10.6.复制一张表 createtables tb_name select * from tb_name
# 复制一张表和数据:create tablenew_table select * from old_table;
# 复制一张表不复制数据create tablenew_table select * from old_table where 0 ;
1.10.7.重命名表rename tableRenameTABLE tb_name TO new_tb_name
altertable rename tb_name to new_table 重命名表
1.11.Mysql 数据管理
1.11.1.插入数据:Insertinto tb_name …values …
[*]指定字段插入:
insertintotb_name (col1,col2,...)values('string',num,...); # 插入数据 (字段名)VALUES值 (‘字符串’, 数值1-9) 字符串要单引数值不需要
insertintotb_name (col1,col2,...)values('string',num),('string',num) # 可同时插入多行数据
例: insert into student (name,sex)value ('zhongliang'.‘m’),(‘xiaoliang’,'f'); # 插入前先查询表的结果DESCtb_name看哪些是必须插入值的 # 未指定的字段代表是允许为null的,可以不在字段位写,按顺序写上不允许为空的字段
[*]不指定字段插入
不指定字段插入,代表全部都插入值
nameagesextelnet
例:insert into students values ('zhongliang',20,'m',13417557083);
语句插入1000条for i in 'sql 1 10000' ; mysql -e "usebbs;inster into t1 values ('zhonglaing','20','man');";done
1.11.2.查询内容:select *from table;
# 显示表的所有字段describe user;
select 字段frometb_name where条件
[*]select * from user;# 查看所有慎用
selectcount(*) from user;统计多少行
select * from user limit 10; 看10行# 在生产环境中不要查所有,应为当上千条数据时会卡死
select * from user where 列名>30; #查询某列的值大于30的select * from user where 列名 like ‘%abc%’; # 查询某列的值包含匹配abc字符的所有内容
# 显示user表的第一行内容select *from user limit 1;select *from user where name=""limit10\G;selectname from user where nam="";
# 内容匹配查询select *from user name link "%zhong%";select *from user name link "%zhong%" and name=xxx ;
# 排列显示,select * from user where User='root'\G;
1.11.3.修改数据:Updatetb_name Set
updatetb_name set 列名=“新值” where列名=“value”; # id
例:update student set tel=13417557083where name=zhongliang; # 修改zhongliang用户的tel电话
1.11.4.删除数据:DeleteFrom tb_name where
deletefrom tb_name where id='value';
例:delete form student wheretel=13417557083
1.12.Mysql 数据库备份还原
Xtranbackup 备份工具1.12.1.Mysql备份数据库
备份数据库
mysqldump -uroot -p --all-databases >all.sql # 备份服务器中所有的库
# 备份mysql 使用root用户,密码123456 备份到/tmp/mysqldump -uroot -p123456 mysql> /tmp/mysql2016.sql
直接将MySQL数据库压缩备份
mysqldump-uroot -p databasename | gzip> backupfile.sql.gz
同时备份多个MySQL数据库
mysqldump -uroot -p –databases databasename1databasename2 databasename3 > multibackupfile.sql
仅仅备份数据库结构
mysqldump –no-data –databases databasename1 databasename2databasename3 > structurebackupfile.sql
C. 跨主机备份 使用下面的命令可以将host1上的sourceDb复制到host2的targetDb,前提是host2主机上已经创建targetDb数据库:
mysqldump -uroot -p sourceDb | mysql –uroot–p--host=192.168.1.100 -C targetDb -C指示主机间的数据传输使用数据压缩 目标主机必须gran授权允许源主机连接
1.12.2.Mysql恢复数据库# 恢复库mysql> mysql –urootzhongliang < /tmp/zhongliang.sql;
# 恢复数据库先创建数据库名,再恢复
还原压缩的MySQL数据库
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
1.12.3.Mysql备份表
Mysqldump –uroot –p zhongliang user > /tmp/user.sql;
备份MySQL数据库某个(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1specific_table2 > backupfile.sql
1.12.4.Mysql恢复表Mysql> source /tmp/mysql.sql;# 在进入数据库中执行
1.12.5.查询数据路径数据库默认存放在/var/lib/mysql/
1.13.Mysql 权限管理
1.13.1.创建用户
Createuser‘username’@’Iphost’identified by'password'
例: createuser ‘zhongliang'@'%' identified by'123456'
1.13.2.删除用户 drop user 'username'@'host'
host: ip: hostname: network 通配符: _:匹配任意单个字符,192.168.0._代表0-9 %:匹配任意字符
zhongliang@'%'
1.13.3.设置权限
例:grant allprivileges on mydb.* to 'zhongliang'@'%' # 给zhongliang所有权限
访问授权:
select 查询insert 插入delete 删除update 更新create 创建alter 修改drop 删除references 外键create temporary table 临时表index 索引create view 创建视图show view 查询视图create routine存储过程alter routineexecute
grant select(user_id,username) on smp.users
grant select(id, se, rank) ontestdb.apache_loggrant all(所有权) on [(数据库)*.*(表)] to (用户)root@'IP地址' identified by '密码';
grant all on mysql to root@127.0.0.1identified by ‘123456';
# 刷新权限flush privileges;
1.13.4.查询权限
Show grantsfor 'zhongliang'@'%'
# 查询某个IP是否有授权select * from mysql.user whereHost=”192.168.1.100” \G
1.13.5.取消权限
Revoke allon mysql.* from ‘root’@’localhost’;
1.13.6.Mysql忘记密码如何破解、道先停止Mysql服务,然后以跳过权限方式后台启动/usr/bin/mysqld_safe --user=myusql--skip-grant-tables & #--skip-grant-tables 跳过权限表启动Mysql 进入数据库update user set password=password('123456')where user='root' and host=’ ’; 修改密码 加了and host可以只删一条,否则是root都删了Flush privileges;
1.13.7.修改服务器root的密码:Mysqladmin –uroot password ‘123456’mysqladmin –uroot –p123456password newpassword ;
1.13.8.root权限丢失怎么解决?
更新的MYSQL.USER表的所有字段中为N的为Y就可以了。update user set Select_priv ='Y' where user = 'root';
update user set Insert_priv ='Y' where user = 'root';
update user set Update_priv ='Y' where user = 'root';
update user set Delete_priv ='Y' where user = 'root';
update user set Create_priv ='Y' where user = 'root';
update user set Drop_priv ='Y' where user = 'root';
update user set Reload_priv ='Y' where user = 'root';
update user set Shutdown_priv ='Y' where user = 'root';
update user set Process_priv ='Y' where user = 'root';
update user set File_priv ='Y' where user = 'root';
update user set Grant_priv ='Y' where user = 'root';
update user set References_priv ='Y' where user = 'root';
update user set Index_priv ='Y' where user = 'root';
update user set Alter_priv ='Y' where user = 'root';
update user set Show_db_priv ='Y' where user = 'root';
update user set Super_priv ='Y' where user = 'root';
update user set Create_tmp_table_priv ='Y' where user = 'root';
update user set Lock_tables_priv ='Y' where user = 'root';
update user set Execute_priv ='Y' where user = 'root';
update user set Repl_slave_priv ='Y' where user = 'root';
update user set Repl_client_priv ='Y' where user = 'root';
update user set Create_view_priv ='Y' where user = 'root';
update user set Show_view_priv ='Y' where user = 'root';
update user set Create_routine_priv ='Y' where user = 'root';
update user set Alter_routine_priv ='Y' where user = 'root';
update user set Create_user_priv ='Y' where user = 'root';
update user set Event_priv ='Y' where user = 'root';
update user set Trigger_priv ='Y' where user = 'root';
1.14.Mysql 主从同步
1.14.1.主从原理mysql主从同步的原理:
1、在master上开启bin-log日志,记录更新,插入,删除的语句。2、必须开启三个线程,主上开启io线程,从上开启io线程和sql线程。3、从上io线程通过授权连接master,master通过io线程检查到slav的请求的日志、postsion点位置。4、master将这些相应的请求内容发送给slave,slave收到后,将内容存放在中继日志realy_log里面,同时生成写入一个master-info,写入日志记录和pos点。日志记录同步的点。5、slave的sql线程检查到realy-log日志更新的内容,并将更新的内容解析成sql语句然后在本地去exec执行。6、主从同步是属于异步方式。1.14.2.MySQL主从同步配置
[*]配置主(master)
[*]修改添加
server-id=1
log-bin=mysql-bin # mysql-bin日志前缀,可自定义
binlog-do-db=db1,db2# 需要同步的库
binlog-ignore-db=db1,db2 # 忽略不同步的库
# binlog两参数2选1都不写全部同步
2.修改配置文件后,重启mysql service mysqld restart
3.grant replication slave on *.* to root@'localhost'identified by '123456';# 创建同步用户 Flush privileges;
4.show master status; # 一定要记住前两列的内容,| File | Position| Binlog_Do_DB | mysql-bin.0000007 106
[*]设置从(slave)
1. vi/data/mysql/my.cnfserver -id =2 # 这个数据不能和主一样
以下可选参数:
replicate-do-db=db1,db2
replicate-ignore-db=db1,db2
2. 进入mysql执行:slave stop;
change master to
master_host='192.168.1.131',master_user='bbs',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=1724;
执行:slave start;
3. 从上查看从的状态:showslave status\G;
Slave_IO_Running: No Slave_SQL_Running: Yes
Last_IO_Errno: 1593 Last_IO_Error: # 检查是否因为有错误NO
# 检查以上二项参数是否都为YES,
vi /root/.mysql_bistory # 创建mysql历史命令ln -s dev/noull > mysql_history # 保户命令历史,创建成空文件
系统历史命令清除bashrc history -c
1.14.3. MySQL主从同步故障解决方案
1.14.3.1.Mysql主从同步,master突然down机,如何恢复:1、在slave数据库上,更改授权网站数据库IP为slave。(这里可以种用/etc/host文件能修改服务器IP和域名的对应,这样只要修改host文件,不需要修改服务器的授权IP)2、修改网站服务器config目录下:config_global.phpconfig_ucenter.php 把原先masterip改成slave ip地址。3、重启httpd服务,切换成功。4、在master上创建数据库,在slave上将数据库导出,在master上导入数据库5、添加数据库grant授权用户,6、如果添加授权用户和密码是一样,后面可省略,否则在slave重新设置连接change7、stop slave,再开始start slave;检查show slave status\G;是否已OK
1.14.3.2.忽略错误后,继续同步该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况解决: stop slave;set global sql_slave_skip_counter =1; # 1指的是跳一步,可以自定义多少步start slave;之后再用mysql>show slave status\G查看:
1.14.3.3.重新做主从,完全同步该方法适用于主从库数据相差较大,或者要求数据完全统一的情况解决步骤如下:1) 进入mater,进行锁表, mysql> flush tables with read lock;注意:该处是锁定为只读状态,语句不区分大小写2) 进行数据备份 #mysqldump -uroot -pmysql> mysql.sql
3) 查看master 状态mysql> showmaster status;+-------------------+----------+--------------+-------------------------------+| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |+-------------------+----------+--------------+-------------------------------+|mysqld-bin.000001 | 272 | |+-------------------+----------+--------------+-------------------------------+4) 把mysql备份文件传到从库机器,进行数据恢复#scp mysql.sql root@192.168.1.13:/tmp/5) 停止slave的状态mysql> stopslave;6) 在slave上恢复数据库 mysql> source /tmp/mysql.sql7) 设置从库同步用户 changemaster to master_host = '192.168.1.12',master_user = root,master_password='123456', master_log_file = 'mysqld-bin.000001', master_log_pos=272;
8)重新开启从同步mysql> startslave;9)查看同步状态mysql> showslave status\G查看:Slave_IO_Running:YesSlave_SQL_Running:Yes10)在master上解锁:mysql>unlocktables;
1.14.3.4.mysql-binlog数据恢复:查看binlog日志的命令:mysqlbinlog mysql-bin.000001|more备份:cp mysql-bin.000001/data/back/20150411/恢复1: mysqlbinlog --start-position=215 --stop-position=336 mysql-bin.000001 | mysql -uroot -p # 注,在勿操作的结点前面开始恢复,stop的post点的肖前点的记录不会执行!!!恢复2:mysqlbinlog--start-datetime="2016-10-18 22:18:25"--stop-datetime="2016-10-18 22:28:38" log.000002 >/home/mysql.sqluse 进入到库里source /home/mysql.sql
1.14.4.MySQL主主同步配置双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。这样做的好处多。 1. 可以做灾备,其中一个坏了可以切换到另一个。 2. 可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。对于异地热备,尤其适合灾备。
在主从同步已经建好的情况下:
[*]Slave设置
[*]在slave中创建用户
grant replication slave on *.* to root@'127.0.0.1'identified by '123456';# 创建同步用户
[*]flush tables with read lock; # 锁定mysql写入,设为只读
[*]打开slave上的 /etc/my.cnf, 开启slave的binarylog:
Log-bin=mysql-bin
[*]如果数据是同步的,我们不需要导数据,直接查看slave的状态:
Show master status\G;#记下File和Position两个值
[*]Master设置
[*]启动同步 设置连接参数
change master tomaster_host='127.0.0.1',master_port=3306,master_user=root,master_password='123456',master_log_file='mysql-bin.000007',master_log_pos=106;
[*]然后重启mysql服务。然后查看,slave状态是否正常:
Show slave status\G;
1.14.5.MySQL主主同步故障解决方案图中出现了两个No。Slave_IO_Running: NoSlave_SQL_Running: No说明slave没有成功, 即,从B到A的同步没有成功。 我们去查看mysql错误日志,前面说过位置:找到机器名.err 文件,打开看看:看图中的error信息。说找不到中继日志文件。这是因为我们在配置A的中继文件时改了中继文件名,但是mysql没有同步。解决办法很简单。先停掉mysql服务。找到这三个文件,把他们删掉。一定要先停掉mysql服务。不然还是不成功。你需要重启一下机器了。或者手动kill mysqld。好了,启动mysql之后。我们在来检查一下slave状态:
1.15.Mysql 常见故障
故障1ERROR 2002 (HY000): Can't connect to localMySQL server through socket '/var/lib/mysql/mysql.sock' (2)
故障原因:服务未启动 service mysqld restart
'--skip-locking' is deprecated and will be removed ina future release. Please use '--skip-external-locking' instead.错误提示:
101009 15:40:10 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql
将/etc/my.cnf里面的skip-locking 改为skip-external-locking
#interactive-timeout 能数值调大
error connecting to master'zhongliang@192.168.207.129:3306' - retry-time: 60retries: 86400
解决方案:密码错误,用户不存在等
初始数据库故障
'--skip-locking' is deprecated and will be removed in a futurerelease. Please use '--skip-external-locking' instead.
解决方法:
将/etc/my.cnf里面的skip-locking改为skip-external-locking
重启mysql
/usr/local/mysql/bin/mysqld: File ‘./mysql-bin.index' not found (Errcode: 13)
/var的权限不够
Mysql启动故障
mysql 错误 You need to use –log-bin to make –binlog-formatwork
出现此错误的原因是 你注释掉了/etc/my.cnf 文件中的log-bin=MySQL-bin ,但是没有注释掉binlog_format 这条
解决办法:编辑my.cnf文件,将binlog_format 这条注释掉.
1.15.1.主从同步故障mysql> showmaster status\G;***************************1. row *************************** File: mysql-binlog.000001 Position: 309 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00sec)
ERROR: No query specified
Got fatal error1236 from master when reading data from binary log: 'Could not find first logfile name in binary log index file'
页:
[1]