MySQL数据库备份守则和方法

时间:2022-04-22 09:09:10 数据库操作系统 我要投稿
  • 相关推荐

MySQL数据库备份守则和方法

  这篇文章主要介绍了MySql数据库备份的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

  MySQL数据库备份守则和方法

  在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。有时,正是MySQL管理员造成破坏。管理员已经知道表已破坏,用诸如vi或Emacs等编辑器试图直接编辑它们,这对表绝对不是件好事!备份数据库两个主要方法是用mysqldump程序或直接拷贝数据库文件(如用cp、cpio或tar等)。 每种方法都有其优缺点:; mysqldump与MySQL服务器协同操作。直接拷贝方法在服务器外部进行,并且你必须采取措施保证没有客户正在修改你将拷贝的表。如果你想用文件系统备份来备份数据库,也会发生同样的问题:如果数据库表在文件系统备份过程中被修改,进入备份的表文件主语不一致的状态,而对以后的恢复表将失去意义。文件系统备份与直接拷贝文件的区别是对后者你完全控制了备份过程,这样你能采取措施确保服务器让表不受干扰。mysqldump比直接拷贝要慢些。;mysqldump生成能够移植到其它机器的文本文件,甚至那些有不同硬件结构的机器上。直接拷贝文件不能移植到其它机器上,除非你正在拷贝的表使用MyISAM存储格式。ISAM表只能在相似的硬件结构的机器上拷贝。在MySQL;3.23中引入的MyISAM表存储格式解决了该问题,因为该格式是机器 无关的,所以直接拷贝文件可以移植到具有不同硬件结构的机器上。只要满足两个条件:另一台机器必须也运行MySQL;3.23或以后版本,而且文件必须以MyISAM格式表示,而不是ISAM格式。

  不管你使用哪种备份方法,如果你需要恢复数据库,有几个原则应该遵守,以确保最好的结果:

  定期实施备份,建立一个计划并严格遵守

  让服务器执行更新日志。当你在崩溃后需要恢复数据时,更新日志将帮助你。在你用备份文件恢复数据到备份时的状态后,你可以通过运行更新日志中的查询再次运用备份后面的修改,这将数据库中的表恢复到崩溃发生时的状态。;以文件系统备份的术语讲,数据库备份文件代表完全倾倒(full;dump),而更新日志代表渐进倾倒(incremental;dump)。

  使用一种统一的和易理解的备份文件命名机制

  象backup1、buckup2等不是特别有意义。当实施你的恢复时,你将浪费时间找出文件里是什么东西。你可能发觉用数据库名和日期构成备份文件名会很有用。例如:;

  %mysqldump;samp_db;>/usr/archives/mysql/samp_db.1999-10-02;

  %mysqldump;menagerie;>/usr/archives/mysql/menagerie.1999-10-02;

  你可能想在生成备份后压缩它们。备份一般都很大!你也需要让你的备份文件有过期期限以避免它们填满你的磁盘,就象你让你的日志文件过期那样。用文件系统备份备份你的备份文件。如果遇上了一个彻底崩溃,不仅清除了你的数据目录,也清除了包含你的数据库备份的磁盘驱动器,你将真正遇上了麻烦。也要备份你的更新日志。将你的备份文件放在不同于用于你的数据库的文件系统上。这将降低由于生成备份而填满包含数据目录的文件系统的可能性。

  用于创建备份的技术同样对拷贝数据库到另一台机器有用。最常见地,一个数据库被转移到了运行在另一台主机上的服务器,但是你也可以将数据转移到同一台主机上的另一个服务器。

  1.使用mysqldump备份和拷贝数据库;

  当你使用mysqldumo程序产生数据库备份文件时,缺省地,文件内容包含创建正在倾倒的表的CREATE语句和包含表中行数据的INSERT语句。换句话说,mysqldump产生的输出可在以后用作mysql的输入来重建数据库。;你可以将整个数据库倾倒进一个单独的文本文件中,如下:

  %mysqldump;samp_db;>/usr/archives/mysql/samp_db.1999-10-02;

  输出文件的开头看起来象这样:;

  #;MySQL;Dump;6.0#

  #;Host:;localhost;Database:;samp_db

  #;Server;version;3.23.2-alpha-log

  ##;Table;structure;for;table;'absence'#

  CREATE;TABLE;absence(;student_id;int(10);

  unsigned;DEFAULT;'0';NOT;NULL,;date;date;DEFAULT;'0000-00-00';NOT;NULL,;PRIMARY;KEY;(student_id,date));

  ##;Dumping;data;for;table;'absence'#

  INSERT;INTO;absence;VALUES;(3,'1999-09-03');

  INSERT;INTO;absence;VALUES;(5,'1999-09-03');

  INSERT;INTO;absence;VALUES;(10,'1999-09-08');

  文件剩下的部分有更多的INSERT和CREATE;TABLE语句组成。;

  如果你想压缩备份,使用类似如下的命令:

  %mysqldump;samp_db;│;gzip;>/usr/archives/mysql/samp_db.1999-10-02.gz;

  如果你要一个庞大的数据库,输出文件也将很庞大,可能难于管理。如果你愿意,你可以在mysqldump命令行的数据库名后列出单独的表名来倾到它们的内容,这将倾倒文件分成较小、更易于管理的文件。下例显示如何将samp_db数据库的一些表倾到进分开的文件中:

  %mysqldump;samp_db;student;score;event;absence;>grapbook.sql;

  %mysqldump;samp_db;member;president;>hist-league.sql;

  如果你生成准备用于定期刷新另一个数据库内容的备份文件,你可能想用--add-drop-table选项。这告诉服务器将DROP;TABLE;IF;EXISTS语句写入备份文件,然后,当你取出备份文件并把它装载进第二个数据库时,如果表已经存在,你不会得到一个错误。如果你倒出一个数据库以便能把数据库转移到另一个服务器,你甚至不必创建备份文件。要保证数据库存在于另一台主机,然后用管道倾倒数据库,这样mysql能直接读取mysqldump的输出。例如:你想从主机pit-viper.snake.net拷贝数据库samp_db到boa.snake.net,可以这样很容易做到:

  %mysqladmin;-h;boa.snake.net;create;samp_db;

  %mysqldump;samp_db;│;mysql;-h;boa.snake.net;samp_db;

  以后,如果你想再次刷新boa.snake.net上的数据库,跳过mysqladmin命令,但要对mysqldump加上--add-drop-table以避免的得到表已存在的错误:

  %mysqldump;--add-drop-table;samp_db;│;mysql;-h;boa.snake.net;samp_db;

  mysqldump其它有用的选项包括:;

  --flush-logs 和 --lock-tables 组合将对你的数据库检查点有帮助。

  --lock-tables 锁定你正在倾倒的所有表

  而 --flush-logs 关闭并重新打开更新日志文件,新的更新日志将只包括从备份点起的修改数据库的查询。这将设置你的更新日志检查点位备份时间。(然而如果你有需要执行个更新的客户,锁定所有表对备份期间的客户访问不是件好事。)如果你使用 --flush-logs 设置检查点到备份时,有可能最好是倾倒整个数据库。如果你倾倒单独的文件,较难将更新日志检查点与备份文件同步。在恢复期间,你通常按数据库为基础提取更新日志内容,对单个表没有提取更新的选择,所以你必须自己提取它们。缺省地,mysqldump 在写入前将一个表的整个内容读进内存。这通常确实不必要,并且实际上如果你有一个大表,几乎是失败的。你可用 --quick 选项告诉 mysqldump 只要它检索出一行就写出每一行。为了进一步优化倾倒过程,使用 --opt而不是 --quick。--opt 选项打开其它选项,加速数据的倾倒和把它们读回。用 --opt 实施备份可能是最常用的方法,因为备份速度上的优势。然而,要警告你,--opt 选项确实有代价,--opt 优化的是你的备份过程,不是其他客户对数据库的访问。--opt 选项通过一次锁定所有表阻止任何人更新你正在倾倒的任何表。你可在一般数据库访问上很容易看到其效果。当你的数据库一般非常频繁地使用,只是一天一次地调节备份。一个具有 --opt 的相反效果的选项是--dedayed。该选项使得 mysqldump 写出 INSERT;DELAYED 语句而不是 INSERT 语句。如果你将数据文件装入另一个数据库并且你想是这个操作对可能出现在该数据库中的查询的影响最小,--delayed 对此很有帮助。 --compress 选项在你拷贝数据库到另一台机器上时很有帮助,因为它减少网络传输字节的数量。下面有一个例子,注意到--compress 对与远端主机上的服务器通信的程序才给出,而不是对与本地主机连接的程序:

  %mysqldump;--opt;samp_db;│;mysql;--compress;-h;boa.snake.net;samp_db;

  2.使用直接拷贝数据库的备份和拷贝方法

  另一种不涉及 mysqldump 备份数据库和表的方式是直接拷贝数据库表文件。典型地,这用诸如 cp、tar 或cpio 实用程序。本文的例子使用 cp。;当你使用一种直接备份方法时,你必须保证表不在被使用。如果服务器在你则正在拷贝一个表时改变它,拷贝就失去意义。保证你的拷贝完整性的最好方法是关闭服务器,拷贝文件,然后重启服务器。如果你不想关闭服务器,要在执行表检查的同时锁定服务器。如果服务器在运行,相同的制约也适用于拷贝文件,而且你应该使用相同的锁定协议让服务器“安静下来”。;假设服务器关闭或你已经锁定了你想拷贝的表,下列显示如何将整个 samp_db 数据库备份到一个备份目录(DATADIR表示服务器的数据目录):

  %cd;DATADIR%cp;-r;samp_db;/usr/archive/mysql;

  单个表可以如下备份:

  %cd;DATADIR/samp_db%cp;member.*;/usr/archive/mysql/samp_db%cp;score.*; /usr/archive/mysql/samp_db;....

  当你完成了备份时,你可以重启服务器(如果关闭了它)或释放加在表上的锁定(如果你让服务器运行)。;要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上,只是将文件拷贝到另一台服务器主机的适当数据目录下即可。要确保文件是 MyIASM 格式或两台机器有相同的硬件结构,否则你的数据库在另一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。

  3.复制数据库(Replicating;Database)

  复制(Replication)类似于拷贝数据库到另一台服务器上,但它的确切含义是实时地保证两个数据库的完全同步。这个功能将在 3.23 版中出现,而且还不很成熟,因此本文不作详细介绍。

  4.用备份恢复数据

  数据库损坏的发生有很多原因,程度也不同。如果你走运,你可能仅损坏一两个表(如掉电),如果你倒霉,你可能必须替换整个数据目录(如磁盘损坏)。在某些情况下也需要恢复,比如用户错误地删除了数据库或表。不管这些倒霉事件的原因,你将需要实施某种恢复。如果表损坏但没丢失,尝试用 myisamchk 或 isamchk 修复它们,如果这样的损坏可有修复程序修复,你可能根本不需要使用备份文件。关于表修复的过程,见《数据库维护与修复》。恢复过程涉及两种信息源:你的备份文件和个更新日志。备份文件将表恢复到实施备份时的状态,然而一般表在备份与发生问题之间的时间内已经被修改,更新日志包含了用于进行这些修改的查询。你可以使用日志文件作为mysql的输入来重复查询。这已正是为什么要启用更新日志的原因。恢复过程视你必须恢复的信息多少而不同。实际上,恢复整个数据库比单个表跟容易,因为对于数据库运用更新日志比单个表容易。

  4.1;恢复整个数据库

  首先,如果你想恢复的数据库是包含授权表的 mysql 数据库,你需要用 --skip-grant-table 选项运行服务器。否则,它会抱怨不能找到授权表。在你已经恢复表后,执行 mysqladmin;flush-privileges 告诉服务器装载授权标并使用它们。将数据库目录内容拷贝到其它某个地方,如果你在以后需要它们。用最新的备份文件重装数据库。如果你用 mysqldump 产生的文件,将它作为 mysql 的输入。如果你用直接从数据库拷贝来的文件,将它们直接拷回数据库目录,然而,此时你需要在拷贝文件之前关闭数据库,然后重启它。使用更新日志重复做备份以后的修改数据库表的查询。对于任何可适用的更新日志,将它们作为 mysql 的输入。指定 --one-database 选项使得 mysql 只执行你有兴趣恢复的数据库的查询。如果你知道你需要运用所有更新日志文件,你可以在包含日志的目录下使用这条命令:

  %;ls;-t;-r;-1;update.[0-9]*;│;xargs;cat;│;mysql;--one-database;db_name;

  ls命令生成更新日志文件的一个单列列表,根据服务器产生它们的次序排序(主意:如果你修改任何一个文件,你将改变排序次序,这导致更新日志一错误的次序被运用。)很可能你会是运用某几个更新日志。例如,自从你备份以来产生的更新日志被命名为 update.392、update.393 等等,你可以这样重新运行:;

  %mysql;--one-database;db_name;<;update.392;

  %mysql;--one-database;db_name;<;update.393;

  如果你正在实施恢复且使用更新日志恢复由于一个错误建议的 DROP;DATABASE、DROP;TABLE 或 DELETE 语句造成丢失的信息,在运用更新日志之前,要保证从其中删除这些语句。

  4.2;恢复单个表

  恢复单个表较为复杂。如果你用一个由 mysqldump 生成的备份文件,并且它不包含你感兴趣的表的数据,你需要从相关行中提取它们并将它们用作 mysql 的输入。这是容易的部分。难的部分是从只运用于该表的更新日志中拉出片断。你会发觉mysql_find_rows 实用程序对此很有帮助,它从更新日志中提取多行查询。另一个可能性是使用另一台服务器恢复整个数据库,然后拷贝你想要的表文件到原数据库中。这可能真的很容易!当你将文件拷回数据库目录时,要确保原数据库的服务器关闭。

  一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。

  3.复制数据库(Replicating;Database

  复制(Replication)类似于拷贝数据库到另一台服务器上,但它的确切含义是实时地保证两个数据库的完全同步。这个功能将在 3.23 版中出现,而且还不很成熟,因此本文不作详细介绍。

  4.用备份恢复数据

  数据库损坏的发生有很多原因,程度也不同。如果你走运,你可能仅损坏一两个表(如掉电),如果你倒霉,你可能必须替换整个数据目录(如磁盘损坏)。在某些情况下也需要恢复,比如用户错误地删除了数据库或表。不管这些倒霉事件的原因,你将需要实施某种恢复。如果表损坏但没丢失,尝试用 myisamchk 或 isamchk 修复它们,如果这样的损坏可有修复程序修复,你可能根本不需要使用备份文件。关于表修复的过程,见《数据库维护与修复》。恢复过程涉及两种信息源:你的备份文件和个更新日志。备份文件将表恢复到实施备份时的状态,然而一般表在备份与发生问题之间的时间内已经被修改,更新日志包含了用于进行这些修改的查询。你可以使用日志文件作为mysql的输入来重复查询。这已正是为什么要启用更新日志的原因。恢复过程视你必须恢复的信息多少而不同。实际上,恢复整个数据库比单个表跟容易,因为对于数据库运用更新日志比单个表容易。

  PHP简直就是一个函数库,丰富的函数使PHP的某些地方相当简单。建议大家down一本PHP的函数手册,总用的到。

  连接MYSQL数据库的步骤

  1、mysql_connect

  打开 MySQL 服务器连接。

  语法: int mysql_connect(string [hostname] [:port], string [username], string [password]); 返回值: 整数

  本函数建立与 MySQL 服务器的连接。其中所有的参数都可省略。当使用本函数却不加任何参数时,参数 hostname 的默认值为 localhost、参数 username 的默认值为 PHP 执行行程的拥有者、参数 password 则为空字符串 (即没有密码)。而参数 hostname 后面可以加冒号与端口号,代表使用哪个端口与 MySQL 连接。当然在使用数据库时,早点使用 mysql_close()将连接关掉可以节省资源。

  2、 mysql_select_db

  选择一个数据库。

  语法: int mysql_select_db(string database_name, int [link_identifier]); 返回值: 整数

  本函数选择 MySQL 服务器中的数据库以供之后的资料查询作业 (query) 处理。成功返回 true,失败则返回 false。

  最简单的例子就是:

  $conn=mysql_connect ("127.0.0.1", "", "");

  mysql_select_db("shop");

  连接机MY SQL数据库,打开SHOP数据库。在实际应用中应当加强点错误判断。

  常用的MySQL数据库语句

  连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)

  断开:exit (回车)

  创建授权:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

  修改密码:mysqladmin -u用户名 -p旧密码 password 新密码

  删除授权: revoke select,,update, om *.* from test2@localhost;

  显示数据库:show databases;

  显示数据表:show tables;

  显示表结构:describe 表名;

  创建库:create database 库名;

  删除库:drop database 库名;

  使用库(选中库):use 库名;

  创建表:create table 表名 (字段设定列表);

  删除表: 表名;

  修改表:alter table t1 rename t2

  查询表:select * from 表名;

  清空表: from 表名;

  备份表: mysqlbinmysqldump -h(ip) -uroot -p(password) databasename tablename > tablename.sql

  恢复表: mysqlbinmysql -h(ip) -uroot -p(password) databasename tablename < tablename.sql(操作前先把原来表删除)

  增加列:ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,ADD INDEX (c);

  修改列:ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

  删除列:ALTER TABLE t2 DROP COLUMN c;

  备份数据库:mysqlbinmysqldump -h(ip) -uroot -p(password) databasename > database.sql

  恢复数据库:mysqlbinmysql -h(ip) -uroot -p(password) databasename < database.sql

  复制数据库:mysqlbinmysqldump --all-databases > all-databases.sql

  修复数据库:mysqlcheck -A -o -uroot -p54safer

  文本数据导入: load data local infile "文件名" into table 表名;

  数据导入导出:mysqlbinmysqlimport database tables.txt

  MYSQL数据库的插入极限分析

  1、如果同时从同一个客户端插入很多行,使用含多个 VALUE的INSERT语句同时插入几行。这比使用单行INSERT语句快(在某些情况下快几倍)。如果你正向一个非空表添加数据,可以调节 bulk__buffer_size变量,使数据插入更快。参见5.3.3 节,“服务器系统变量”。

  2、如果你从不同的客户端插入很多行,能通过INSERT DELAYED语句加快速度。参见13.2.4 节,“INSERT语法”。

  3、用MyISAM,如果在表中没有删除的行,能在SELECT语句正在运行的同时插入行。

  4、当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句快20倍。参见13.2.5 节,“LOAD DATA INFILE语法”。

  5、当表有很多索引时,有可能要多做些工作使得LOAD DATA INFILE更快些。使用下列过程:

  1). 有选择地用CREATE TABLE创建表。

  2). 执行FLUSH TABLES语句或命令mysqladmin flush-tables。

  3). 使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name。这将从表中取消所有索引的使用。

  4). 用LOAD DATA INFILE把数据插入到表中,因为不更新任何索引,因此很快。

  5). 如果只想在以后读取表,使用myisampack压缩它。参见15.1.3.3 节,“压缩表特性”。

  6). 用myisamchk -r -q /path/to/db/tbl_name重新创建索引。这将在写入磁盘前在内存中创建索引树,并且它更快,因为避免了大量磁盘搜索。结果索引树也被完美地平衡。

  7). 执行FLUSH TABLES语句或mysqladmin flush-tables命令。

  6、锁定表可以加速用多个语句执行的INSERT操作:

  * LOCK TABLES a WRITE;

  * INSERT INTO a VALUES (1,23),(2,34),(4,33);

  * INSERT INTO a VALUES (8,26),(6,29);

  * UNLOCK TABLES;

  这样性能会提高,因为索引缓存区仅在所有INSERT语句完成后刷新到磁盘上一次。一般有多少INSERT语句即有多少索引缓存区刷新。如果能用一个语句插入所有的行,就不需要锁定。

  对于事务表,应使用BEGIN和COMMIT代替LOCK TABLES来加快插入。

  MySQL数据库出错代码列表

  MySQL出错代码列表:

  1005:创建表失败

  1006:创建数据库失败

  1007:数据库已存在,创建数据库失败

  1008:数据库不存在,删除数据库失败

  1009:不能删除数据库文件导致删除数据库失败

  1010:不能删除数据目录导致删除数据库失败

  1011:删除数据库文件失败

  1012:不能读取系统表中的记录

  1020:记录已被其他用户修改

  1021:硬盘剩余空间不足,请加大硬盘可用空间

  1022:关键字重复,更改记录失败

  1023:关闭时发生错误

  1024:读文件错误

  1025:更改名字时发生错误

  1026:写文件错误

  1032:记录不存在

  1036:数据表是只读的,不能对它进行修改

  1037:系统内存不足,请重启数据库或重启服务器

  1038:用于排序的内存不足,请增大排序缓冲区

  1040:已到达数据库的最大连接数,请加大数据库可用连接数

  1041:系统内存不足

  1042:无效的主机名

  1043:无效连接

  1044:当前用户没有访问数据库的权限

  1045:不能连接数据库,用户名或密码错误

  1048:字段不能为空

  1049:数据库不存在

  1050:数据表已存在

  1051:数据表不存在

  1054:字段不存在(SQLSTATE:42S22)

  1065:无效的SQL语句,SQL语句为空

  1081:不能建立Socket连接

  1114:数据表已满,不能容纳任何记录

  1116:打开的数据表太多

  1129:数据库出现异常,请重启数据库

  1130:连接数据库失败,没有连接数据库的权限

  1133:数据库用户不存在

  1141:当前用户无权访问数据库

  1142:当前用户无权访问数据表

  1143:当前用户无权访问数据表中的字段

  1146:数据表不存在

  1147:未定义用户对数据表的访问权限

  1149:SQL语句语法错误

  1158:网络错误,出现读错误,请检查网络连接状况

  1159:网络错误,读超时,请检查网络连接状况

  1160:网络错误,出现写错误,请检查网络连接状况

  1161:网络错误,写超时,请检查网络连接状况

  1062:字段值重复,入库失败

  1064:语法错误,常见的比如注释--后没加空格

  1169:字段值重复,更新记录失败

  1177:打开数据表失败

  1180:提交事务失败

  1181:回滚事务失败

  1193:变量没声明,常在写存储过程时发生

  1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库

  1205:加锁超时

  1211:当前用户没有创建用户的权限

  1216:外键约束检查失败,更新子表记录失败

  1217:外键约束检查失败,删除或修改主表记录失败

  1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器

  1227:权限不足,您无权进行此操作

  1235:MySQL版本过低,不具有本功能

  MySQL数据库所支持的操作系统介绍

  我们使用GNU Autoconf,因此将MySQL移植到所有使用Posix线程和C++编译器的现代系统是可能的。(要求服务器支持线程。如果只是编译客户端代码,则只需要C++编译器)。我们主要在Linux(SuSE和Red Hat)、FreeBSD和Sun Solaris(版本8和9)上使用并开发本软件。

  已经报告MySQL可以在下列操作系统/线程包的组合上成功地进行编译。注意,对于很多操作系统,原生的线程仅支持最新的版本。

  · 有原生线程的AIX 4.x和5.x。

  · Amiga。

  · 包括MIT-pthreads包的BSDI 2.x。

  · 有原生线程的BSDI3.0,3.1和4.x。

  · 有原生线程的Digital Unix 4.x。

  · 包括MIT-pthreads包的FreeBSD 2.x。

  · 有原生线程的FreeBSD 3.x和4.x。

  · 有LinuxThreads的FreeBSD 4.x。

  · 有DCE线程或MIT-pthreads包的HP-UX 10.20。

  · 有原生线程的HP-UX 11.x。

  · 有LinuxThreads 0.7.1+或glibc 2.0.7+,适合各种CPU的Linux 2.0+。

  · Mac OS X。

  · NetBSD 1.3/1.4 Intel和NetBSD 1.3 Alpha(需要GNU make)。

  · Novell NetWare 6.0。

  · 有原生线程的OpenBSD > 2.5。包括MIT-pthreads包的OpenBSD < 2.5。

  · OS/2 Warp 3, FixPack 29和OS/2 Warp 4, FixPack 4.

  · 有最新FSU Pthreads移植包的SCO OpenServer 5.0.X。

  · SCO UnixWare 7.1.x。

  · SCO Openserver 6.0.x。

  · 有原生线程的SGI Irix 6.x。

  · SPARC和x86上有原生线程的Solaris 2.5和以上版本。

  · 包括MIT-pthreads包的SunOS 4.x。

  · Tru64 Unix。

  · Windows 9x、Me、NT、2000、XP和2003。