데이터 베이스 MySQL 튜토리얼 Centos 推荐使用xtrabackup备份数据库_MySQL

Centos 推荐使用xtrabackup备份数据库_MySQL

May 30, 2016 pm 05:10 PM
지원 데이터 베이스

mysqldump是一种逻辑备份方式,将数据转换成sql文件,其最大的缺陷就是备份和恢复时间很长,对于一个小于10G的数据库而言,这个速度还是可以接受的,但是如果数据库较大,那在使用mysqldump备份就非常不合适了。

 

lvm是一种采用逻辑卷快照功能对数据进行备份,可以实现几乎热备,但是备份过程较为复杂(来回切换终端),很难用shell脚本直接实现,不过现在似乎有个工具mylvmbackup可以实现自动化备份,但是没有尝试过,改天我也试试。

 

Xtrabackup对MyISAM表只能实现温备,并且不支持增量备份,所以每次对MyISAM表备份都是全备

 

XtraBackup更多高级特性通常只能在innodb存储引擎上实现,而且高级特性还都依赖于mysql数据库对innodb引擎实现了单独表空间,否则没办法实现单表或单库导出

 

mysql> show global variables like '%innodb_file_per_table%';

+-----------------------+-------+

| Variable_name         | Value |

+-----------------------+-------+

| innodb_file_per_table | ON    |

+-----------------------+-------+

1 row in set (0.00 sec)

 

那么今天就和大家聊聊第三款开源备份工具xtrabackup:

官方站点:http://www.percona.com

官方在线文档:http://www.percona.com/doc/percona-xtrabackup/2.2/

最新软件包下载地址:http://www.percona.com/downloads/XtraBackup/

 

一、简介

Xtrabackup是由percona提供的mysql数据库开源热备工具。特点如下:

 

(1)备份过程快速、可靠;

 

(2)备份过程不会打断正在执行的事务;

 

(3)能够基于压缩等功能节约磁盘空间和流量;

 

(4)自动实现备份检验;

 

(5)还原速度快;

 

二、安装

 

XtraBackup目前最新版为2.2.9,本篇博客采用yum安装方式

1、yum安装

# yum -y install libaio perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SSL

# rpm -ivh https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.2/binary/redhat/6/x86_64/percona-xtrabackup-2.3.2-1.el6.x86_64.rpm

 

2、查看Xtrabackup安装的工具

 

# rpm -ql percona-xtrabackup |grep bin

 

/usr/bin/innobackupex

/usr/bin/xbcloud

/usr/bin/xbcloud_osenv

/usr/bin/xbcrypt

/usr/bin/xbstream

/usr/bin/xtrabackup

 

3、XtraBackup中主要包含了三个工具

 

xbsteam:支持流式备份

 

xtrbackup:用于热备innodb、xtradb表中数据的工具,不能备份其它类型的表,也不能备份数据表结构

 

innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份MyISAM表的能力

xbcrypt:用于加密或解密备份的数据库

 

xbcloud:用于从云上上传和下载全部或部分xbstream档案

 

三、innobackupex几个非常重要的参数

 

--apply-log

 

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

 

--redo-only

 

准备(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

 

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

 

(2)基于所有的备份将未提交的事务进行“回滚”。

 

--copy-back

 

该选项用于执行恢复(还原)操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。

 

四、innobackup备份语法

 

完全备份+完全恢复

 

完全备份

 

# innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/

 

准备一个完全备份

 

# innobackupex --apply-log  /path/to/BACKUP-DIR

 

从一个完全备份中恢复数据

# innobackupex --copy-back /path/to/BACKUP-DIR

 

修改datadir目录权限

# chown -R  mysql:mysql  /mydata/data/

 

完全备份+增量备份+完全恢复

 

完全备份:

# innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/

 

第一次增量备份

# innobackupex --user=DBUSER --password=DBUSERPASS --incremental /backup --incremental-basedir=BASEDIR

 

第二次增量备份

# innobackupex --user=DBUSER --password=DBUSERPASS --incremental /backup --incremental-basedir=BASEDIR

 

准备:

 

执行完全备份redo

# innobackupex --apply-log --redo-only BASE-DIR

 

执行第一次增量备份redo

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

 

执行第二次增量备份redo

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

 

还原:

# innobackupex --copy-back BASE-DIR

 

解释:

 

其中BASE-DIR指的是完全备份所在的目录,

 

而INCREMENTAL-DIR-1指的是第一次增量备份的目录,

 

INCREMENTAL-DIR-2指的是第二次增量备份的目录,

 

其它依次类推,即如果有多次增量备份,每一次都要执行如上操作;

 

五、以上两种方式案列重放

 

完全备份+完全恢复

 

1、实验前的准备工作

 

# service mysqld stop
# rm -rf /mydata/data/* 
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ --basedir=/usr/local/mysql/
# service mysqld start
# mysqladmin -uroot -p password 123456
# mysql -uroot -p123456
mysql> create database jiaowu;
mysql> use jiaowu;
mysql> set sql_log_bin = 0;
mysql> source /root/tutor.sql;    //导入tutor数据表
mysql> set sql_log_bin = 1;
mysql> select * from tutor;
+------+---------------+--------+------+
| TID  | Tname         | Gender | Age  |
+------+---------------+--------+------+
|    1 | ZhengYansheng | M      |   25 |
|    2 | LiJian        | M      |   26 |
|    3 | OuYangyu      | M      |   27 |
|    4 | LuoChenghui   | M      |   25 |
|    5 | LiuYunbo      | M      |   25 |
|    6 | FuJian        | M      |   24 |
|    7 | LiMenglu      | F      |   23 |
|    8 | BaoYintu      | M      |   28 |
|    9 | WangYana      | F      |   25 |
+------+---------------+--------+------+
9 rows in set (0.00 sec)
로그인 후 복사

2、innobackupex对DB进行完全备份

# innobackupex --user=root --password=123456 /backup/

如果执行正确,其最后输出的几行信息通常如下:

innobackupex: Backup created in directory '/backup/2015-03-18_21-00-17'

innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 332

150318 21:00:23 innobackupex: Connection to database server closed

150318 21:00:23 innobackupex: completed OK!

3、查看备份目录和文件

# ls /backup/

2015-03-18_21-00-17

# ls /backup/2015-03-18_21-00-17/

backup-my.cnf jiaowu performance_schema xtrabackup_binlog_info xtrabackup_info

ibdata1 mysql test xtrabackup_checkpoints xtrabackup_logfile

4、准备一个完全备份

# innobackupex --user=root --password=123456 --apply-log /backup/2015-03-18_21-00-17/

#####模拟数据库故障#####

5、这里还是采用老方法直接删除所有的数据文件

# service mysqld stop

# rm -rf /mydata/data/*

6、从一个完全备份中恢复数据库

# innobackupex --copy-back /backup/2015-03-18_21-00-17/

7、修改数据目录权限

# chown -R mysql.mysql /mydata/data/

8、启动mysqld服务

# service mysqld start

9、登陆mysql查看是否是否一致

# mysql -e 'use jiaowu;select * from tutor;'

+------+---------------+--------+------+

| TID | Tname | Gender | Age |

+------+---------------+--------+------+

| 1 | ZhengYansheng | M | 25 |

| 2 | LiJian | M | 26 |

| 3 | OuYangyu | M | 27 |

| 4 | LuoChenghui | M | 25 |

| 5 | LiuYunbo | M | 25 |

| 6 | FuJian | M | 24 |

| 7 | LiMenglu | F | 23 |

| 8 | BaoYintu | M | 28 |

| 9 | WangYana | F | 25 |

+------+---------------+--------+------+

#数据已经成功恢复到数据库当中

完全备份+增量备份+完全恢复

1、实验前的准备工作

# service mysqld stop
# rm -rf /mydata/data/*     //删除原来的备份文件
# rm -rf /backup/*
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ --basedir=/usr/local/mysql/
# service mysqld start
# mysqladmin -uroot -p password 123456
# mysql -uroot -p123456
mysql> create database jiaowu;
mysql> use jiaowu;
mysql> set sql_log_bin = 0;
mysql> source /root/tutor.sql;   //导入tutor数据表
mysql> set sql_log_bin = 1;
mysql> select * from tutor;
+------+---------------+--------+------+
| TID  | Tname         | Gender | Age  |
+------+---------------+--------+------+
|    1 | ZhengYansheng | M      |   25 |
|    2 | LiJian        | M      |   26 |
|    3 | OuYangyu      | M      |   27 |
|    4 | LuoChenghui   | M      |   25 |
|    5 | LiuYunbo      | M      |   25 |
|    6 | FuJian        | M      |   24 |
|    7 | LiMenglu      | F      |   23 |
|    8 | BaoYintu      | M      |   28 |
|    9 | WangYana      | F      |   25 |
+------+---------------+--------+------+
9 rows in set (0.00 sec)
로그인 후 복사

2、innobackupex对DB进行完全备份

# innobackupex --user=root --password=123456 /backup/

如果执行正确,其最后输出的几行信息通常如下:

innobackupex: Backup created in directory '/backup/2015-03-18_21-14-49'

innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 332

150318 21:14:54 innobackupex: Connection to database server closed

150318 21:14:54 innobackupex: completed OK!

3、仅查看备份目录

# ls /backup/

2015-03-18_21-14-49

4、操作数据库并插入数据

# mysql jiaowu;
mysql> insert into tutor(TID) values(11);
mysql> insert into tutor(TID) values(12);
mysql> insert into tutor(TID) values(13);
mysql> select * from tutor;
+------+---------------+--------+------+
| TID  | Tname         | Gender | Age  |
+------+---------------+--------+------+
|    1 | ZhengYansheng | M      |   25 |
|    2 | LiJian        | M      |   26 |
|    3 | OuYangyu      | M      |   27 |
|    4 | LuoChenghui   | M      |   25 |
|    5 | LiuYunbo      | M      |   25 |
|    6 | FuJian        | M      |   24 |
|    7 | LiMenglu      | F      |   23 |
|    8 | BaoYintu      | M      |   28 |
|    9 | WangYana      | F      |   25 |
|   11 | NULL          | NULL   | NULL |
|   12 | NULL          | NULL   | NULL |
|   13 | NULL          | NULL   | NULL |
+------+---------------+--------+------+
12 rows in set (0.00 sec)
로그인 후 복사

5、执行第一次增量备份并查看备份目录

# innobackupex --user=root --password=123456 --incremental /backup/ --incremental-basedir=/backup/2015-03-18_21-14-49/

# ls /backup/

2015-03-18_21-14-49 2015-03-18_21-18-45

6、再次操作数据库并插入多条数据

# mysql jiaowu;
mysql> insert into tutor(TID) values(21);
mysql> insert into tutor(TID) values(22);
mysql> insert into tutor(TID) values(23);
mysql> select * from tutor;
+------+---------------+--------+------+
| TID  | Tname         | Gender | Age  |
+------+---------------+--------+------+
|    1 | ZhengYansheng | M      |   25 |
|    2 | LiJian        | M      |   26 |
|    3 | OuYangyu      | M      |   27 |
|    4 | LuoChenghui   | M      |   25 |
|    5 | LiuYunbo      | M      |   25 |
|    6 | FuJian        | M      |   24 |
|    7 | LiMenglu      | F      |   23 |
|    8 | BaoYintu      | M      |   28 |
|    9 | WangYana      | F      |   25 |
|   11 | NULL          | NULL   | NULL |
|   12 | NULL          | NULL   | NULL |
|   13 | NULL          | NULL   | NULL |
|   21 | NULL          | NULL   | NULL |
|   22 | NULL          | NULL   | NULL |
|   23 | NULL          | NULL   | NULL |
+------+---------------+--------+------+
15 rows in set (0.00 sec)
로그인 후 복사

7、执行第二次增量备份并查看备份文件

# innobackupex --user=root --password=123456 --incremental /backup/ --incremental-basedir=/backup/2015-03-18_21-18-45/

# ls /backup/

2015-03-18_21-14-49 2015-03-18_21-18-45 2015-03-18_21-22-31

解释:

2015-03-18_21-14-49:为innobackupex的完全备份目录

2015-03-18_21-18-45:为innobackupex的第一次增量备份目录

2015-03-18_21-22-31:为innobackupex的第二次增量备份目录

8、开始准备innobackupex

首先执行完全备份redo-only

# innobackupex --user=root --password=123456 --apply-log --redo-only /backup/2015-03-18_21-14-49/

执行第一个增量备份redo-only

# innobackupex --user=root --password=123456 --apply-log --redo-only /backup/2015-03-18_21-14-49/ --incremental-dir=/backup/2015-03-18_21-18-45/

执行第二个增量备份redo-only

# innobackupex --user=root --password=123456 --apply-log --redo-only /backup/2015-03-18_21-14-49/ --incremental-dir=/backup/2015-03-18_21-22-31/

#####模拟数据库故障#####

9、这里还是采用老方法直接删除所有的数据文件

# service mysqld stop

# rm -rf /mydata/data/*

10、从完全备份中恢复数据库

# innobackupex --user=root --password=123456 --copy-back /backup/2015-03-18_21-14-49/

11、修改数据目录权限

# chown -R mysql.mysql /mydata/data/

12、启动mysqld服务

# service mysqld start

13、登陆mysql查看是否是否一致

# mysql -e 'use jiaowu;select * from tutor;'

+------+---------------+--------+------+

| TID | Tname | Gender | Age |

+------+---------------+--------+------+

| 1 | ZhengYansheng | M | 25 |

| 2 | LiJian | M | 26 |

| 3 | OuYangyu | M | 27 |

| 4 | LuoChenghui | M | 25 |

| 5 | LiuYunbo | M | 25 |

| 6 | FuJian | M | 24 |

| 7 | LiMenglu | F | 23 |

| 8 | BaoYintu | M | 28 |

| 9 | WangYana | F | 25 |

| 11 | NULL | NULL | NULL |

| 12 | NULL | NULL | NULL |

| 13 | NULL | NULL | NULL |

| 21 | NULL | NULL | NULL |

| 22 | NULL | NULL | NULL |

| 23 | NULL | NULL | NULL |

+------+---------------+--------+------+

#两次增量添加的数据也已经成功添加到数据库当中。恢复成功

六、Xtrabackup的高级功能

流式压缩功能

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。如:

# innobackupex --user=root --password=123456 --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz

甚至也可以使用类似如下命令将数据备份至其它服务器:强烈推荐这种方式

# innobackupex --user=root --password=123456 --stream=tar /backup | ssh root@192.168.1.100 'cat - > /backup/`date +%F_%H-%M-%S`.tar'

在执行本地备份时,还可以使用--parallel选项对多个文件进行并行复制(暂时还没有看懂此选项)

此外,在执行本地备份时,还可以使用--parallel选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。当然,在实际进行备份时要利用此功能的便利性,也需要启用innodb_file_per_table选项或共享的表空间通过innodb_data_file_path选项存储在多个ibdata文件中。对某一数据库的多个文件的复制无法利用到此功能。其简单使用方法如下:

# innobackupex --parallel /path/to/backup

同时,innobackupex备份的数据文件也可以存储至远程主机,这可以使用--remote-host选项来实现:

# innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup

七、使用Xtrabackup对数据库进行部分备份

Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据通过管道传输给其它程序进行处理。

此外,还原部分备份跟还原全部数据的备份也有所不同,即你不能通过简单地将prepared的部分备份使用--copy-back选项直接复制回数据目录,而是要通过导入表的方向来实现还原。当然,有些情况下,部分备份也可以直接通过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,因此,无论如何不推荐使用这种方式。

(1)创建部分备份

创建部分备份的方式有三种:

正则表达式(--include)

枚举表文件(--tables-file)

列出要备份的数据库(--databases)。

(a)使用--include

使用--include时,要求为其指定要备份的表的完整名称,即形如databasename.tablename,如:

# innobackupex --include='^mageedu[.]tb1' /path/to/backup

(b)使用--tables-file

此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称;如:

# echo -e 'mageedu.tb1\nmageedu.tb2' > /tmp/tables.txt

# innobackupex --tables-file=/tmp/tables.txt /path/to/backup

(c)使用--databases

此选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;同时,在指定某数据库时,也可以只指定其中的某张表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。如:

# innobackupex --databases="mageedu testdb" /path/to/backup

(2)整理(preparing)部分备份

prepare部分备份的过程类似于导出表的过程,要使用--export选项进行:

# innobackupex --apply-log --export /pat/to/partial/backup

此命令执行过程中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,因此,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表创建.exp文件的相关信息。

(3)还原部分备份

还原部分备份的过程跟导入表的过程相同。当然,也可以通过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。

案列演示:

对jiaowu数据库进行备份和还原

1、查看数据库和表

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jiaowu             |
| mysql              |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from jiaowu.tutor;
+------+---------------+--------+------+
| TID  | Tname         | Gender | Age  |
+------+---------------+--------+------+
|    1 | ZhengYansheng | M      |   25 |
|    2 | LiJian        | M      |   26 |
|    3 | OuYangyu      | M      |   27 |
|    4 | LuoChenghui   | M      |   25 |
|    5 | LiuYunbo      | M      |   25 |
|    6 | FuJian        | M      |   24 |
|    7 | LiMenglu      | F      |   23 |
|    8 | BaoYintu      | M      |   28 |
|    9 | WangYana      | F      |   25 |
|   11 | NULL          | NULL   | NULL |
|   12 | NULL          | NULL   | NULL |
|   13 | NULL          | NULL   | NULL |
|   21 | NULL          | NULL   | NULL |
|   22 | NULL          | NULL   | NULL |
|   23 | NULL          | NULL   | NULL |
+------+---------------+--------+------+
로그인 후 복사

2、innobackupex进行备份

# innobackupex --user=root --password=123456 --databases='jiaowu' /opt/

3、准备并导入jiaowu表

# innobackupex --user=root --password=123456 --apply-log --export /opt/2015-03-18_22-46-47/

4、删除jiaowu数据库

# rm -rf /mydata/data/jiaowu

5、登陆数据库查看是否还存在jiaowu数据库

[root@localhost ~]# mysql -e 'show databases;'

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| test |

+--------------------+

#jiaowu数据库不存在了

6、还原jiaowu数据库

# cp -a /opt/2015-03-18_22-46-47/jiaowu/ /mydata/data/

7、修改jiaowu权限

# chown -R mysql.mysql /mydata/data/jiaowu

8、再次查看jiaowu数据库是否存在

[root@localhost ~]# mysql -e 'use jiaowu;show tables;'

+------------------+

| Tables_in_jiaowu |

+------------------+

| tutor |

+------------------+

#jiaowu数据库已经被还原并且表tutor还在。成功!!!

八、导入或导出单张表

默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过,此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来说,是要“导出”的表在其创建之前,mysql服务器就启用了innodb_file_per_table选项),

并且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。

(1)“导出”表

导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了:

# innobackupex --apply-log --export /path/to/backup

此命令会为每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其它服务器。

(2)“导入”表

要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:

mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然后将此表的表空间删除:

mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”:

mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

案列演示:

1、查看表

mysql> use jiaowu;

Database changed

mysql> show tables;

+------------------+

| Tables_in_jiaowu |

+------------------+

| tutor |

+------------------+

1 row in set (0.00 sec)

2、修改表的存储引擎为InnoDB

mysql> alter table tutor engine=innodb;

Query OK, 15 rows affected (0.05 sec)

Records: 15 Duplicates: 0 Warnings: 0

3、innobackupex对其进行备份

# innobackupex --user=root --password=123456 --databases='jiaowu.tutor' /opt/

4、准备并导出

# innobackupex --user=root --password=123456 --apply-log --export /opt/2015-03-18_23-05-44/

5、删除此表的表空间

mysql> ALTER TABLE jiaowu.tutor DISCARD TABLESPACE;

Query OK, 0 rows affected (0.01 sec)

mysql> use jiaowu;

Database changed

mysql> select * from tutor; #数据已经不存在了

ERROR 1030 (HY000): Got error -1 from storage engine

6、接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”:并修改权限

# cp /opt/2015-03-18_23-24-23/jiaowu/{tutor.exp,tutor.ibd} /mydata/data/jiaowu/
cp:是否覆盖"/mydata/data/jiaowu/tutor.exp"? yes
# chown -R mysql.mysql /mydata/data/jiaowu/*
mysql> ALTER TABLE jiaowu.tutor IMPORT TABLESPACE;
Query OK, 0 rows affected (0.00 sec)
mysql> use jiaowu;
Database changed
mysql> select * from tutor;
+------+---------------+--------+------+
| TID  | Tname         | Gender | Age  |
+------+---------------+--------+------+
|    1 | ZhengYansheng | M      |   25 |
|    2 | LiJian        | M      |   26 |
|    3 | OuYangyu      | M      |   27 |
|    4 | LuoChenghui   | M      |   25 |
|    5 | LiuYunbo      | M      |   25 |
|    6 | FuJian        | M      |   24 |
|    7 | LiMenglu      | F      |   23 |
|    8 | BaoYintu      | M      |   28 |
|    9 | WangYana      | F      |   25 |
|   11 | NULL          | NULL   | NULL |
|   12 | NULL          | NULL   | NULL |
|   13 | NULL          | NULL   | NULL |
|   21 | NULL          | NULL   | NULL |
|   22 | NULL          | NULL   | NULL |
|   23 | NULL          | NULL   | NULL |
+------+---------------+--------+------+
15 rows in set (0.00 sec)
로그인 후 복사

 

 

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP에서 MySQL 백업 및 복원을 사용하는 방법은 무엇입니까? PHP에서 MySQL 백업 및 복원을 사용하는 방법은 무엇입니까? Jun 03, 2024 pm 12:19 PM

PHP에서 MySQL 데이터베이스를 백업하고 복원하는 작업은 다음 단계에 따라 수행할 수 있습니다. 데이터베이스 백업: mysqldump 명령을 사용하여 데이터베이스를 SQL 파일로 덤프합니다. 데이터베이스 복원: mysql 명령을 사용하여 SQL 파일에서 데이터베이스를 복원합니다.

Go 언어는 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 어떻게 구현합니까? Go 언어는 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 어떻게 구현합니까? Mar 27, 2024 pm 09:39 PM

Go 언어는 효율적이고 간결하며 배우기 쉬운 프로그래밍 언어입니다. 동시 프로그래밍과 네트워크 프로그래밍의 장점 때문에 개발자들이 선호합니다. 실제 개발에서 데이터베이스 작업은 필수적인 부분입니다. 이 기사에서는 Go 언어를 사용하여 데이터베이스 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. Go 언어에서는 일반적으로 사용되는 SQL 패키지, Gorm 등과 같은 타사 라이브러리를 사용하여 데이터베이스를 운영합니다. 여기서는 sql 패키지를 예로 들어 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. MySQL 데이터베이스를 사용하고 있다고 가정합니다.

Hibernate는 어떻게 다형성 매핑을 구현합니까? Hibernate는 어떻게 다형성 매핑을 구현합니까? Apr 17, 2024 pm 12:09 PM

Hibernate 다형성 매핑은 상속된 클래스를 데이터베이스에 매핑할 수 있으며 다음 매핑 유형을 제공합니다. Join-subclass: 상위 클래스의 모든 열을 포함하여 하위 클래스에 대한 별도의 테이블을 생성합니다. 클래스별 테이블: 하위 클래스별 열만 포함하는 하위 클래스에 대한 별도의 테이블을 만듭니다. Union-subclass: Joined-subclass와 유사하지만 상위 클래스 테이블이 모든 하위 클래스 열을 통합합니다.

iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. Jul 18, 2024 am 05:48 AM

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

HTML이 데이터베이스를 읽는 방법에 대한 심층 분석 HTML이 데이터베이스를 읽는 방법에 대한 심층 분석 Apr 09, 2024 pm 12:36 PM

HTML은 데이터베이스를 직접 읽을 수 없지만 JavaScript 및 AJAX를 통해 읽을 수 있습니다. 단계에는 데이터베이스 연결 설정, 쿼리 보내기, 응답 처리 및 페이지 업데이트가 포함됩니다. 이 기사에서는 JavaScript, AJAX 및 PHP를 사용하여 MySQL 데이터베이스에서 데이터를 읽는 실제 예제를 제공하고 쿼리 결과를 HTML 페이지에 동적으로 표시하는 방법을 보여줍니다. 이 예제에서는 XMLHttpRequest를 사용하여 데이터베이스 연결을 설정하고 쿼리를 보내고 응답을 처리함으로써 페이지 요소에 데이터를 채우고 데이터베이스를 읽는 HTML 기능을 실현합니다.

PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 Jun 04, 2024 pm 01:42 PM

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())

PHP에서 데이터베이스 연결 오류를 처리하는 방법 PHP에서 데이터베이스 연결 오류를 처리하는 방법 Jun 05, 2024 pm 02:16 PM

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

PHP를 사용하여 데이터베이스에서 중국어 왜곡 문자를 처리하기 위한 팁과 사례 PHP를 사용하여 데이터베이스에서 중국어 왜곡 문자를 처리하기 위한 팁과 사례 Mar 27, 2024 pm 05:21 PM

PHP는 웹사이트 개발에 널리 사용되는 백엔드 프로그래밍 언어로, 강력한 데이터베이스 운영 기능을 갖추고 있으며 MySQL과 같은 데이터베이스와 상호 작용하는 데 자주 사용됩니다. 그러나 한자 인코딩의 복잡성으로 인해 데이터베이스에서 잘못된 한자를 처리할 때 문제가 자주 발생합니다. 이 기사에서는 잘못된 문자의 일반적인 원인, 솔루션 및 특정 코드 예제를 포함하여 데이터베이스에서 중국어 잘못된 문자를 처리하기 위한 PHP의 기술과 사례를 소개합니다. 문자가 왜곡되는 일반적인 이유는 잘못된 데이터베이스 문자 집합 설정 때문입니다. 데이터베이스를 생성할 때 utf8 또는 u와 같은 올바른 문자 집합을 선택해야 합니다.

See all articles