±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖ÷Òª½éÉÜÁËPostgreSQLµÄÔ´´úÂ룬˵Ã÷ÁËPostgreSQL
9.1µÄÈ«Ìå½á¹¹£¬»¹ÓÐ˵Ã÷ÁË´úÂëÊ÷,È»ºó»¹Ê¹ÓÃÁ˵÷ÊÔÆ÷À´×·×ÙPostgreSQLµÄ¶¯×÷¡£
|
|
PostgreSQLµÄʹÓÃÐÎ̬
PostgreSQL²ÉÓÃC/S(¿Í»§»ú/·þÎñÆ÷)ģʽ½á¹¹¡£Ó¦Óòãͨ¹ýINET»òÕßUnix SocketÀûÓüȶ¨µÄÐÒéÓëÊý¾Ý¿â·þÎñÆ÷½øÐÐͨÐÅ¡£
ÁíÍ⣬»¹ÓÐÒ»ÖÖ¡®Standalone Backend¡¯Ê¹Óõķ½Ê½, ËäȻͨ¹ýÕâÖÖ·½Ê½Ò²¿ÉÒÔÆô¶¯·þÎñÆ÷£¬µ«ÊÇÒ»°ãÖ»ÔÚÊý¾Ý¿âµÄ³õʼ»¯(PostgreSQLµÄclusterµÄ³õʼ»¯£¬Ï൱ÓÚÆäËûÊý¾Ý¿âµÄinstanceµÄ³õʼ»¯)¡¢½ô¼±Î¬»¤µÄʱºòʹÓã¬ËùÒÔ¼òµ¥À´Ëµ¿ÉÒÔÈÏΪPostgreSQLÊÇʹÓÃC/SµÄÐÎʽ½øÐзÃÎʵġ£
PostgreSQL°Ñ¿Í»§¶Ë³ÆÎªÇ°¶Ë(Frontend),°Ñ·þÎñÆ÷¶Ë³ÉΪºó¶Ë(Backend),
ºó¶ËÓи´Êý¸ö½ø³Ì¹¹³É£¬Õâ¸öÔÚºóÃæ»á½øÐÐ˵Ã÷¡£
ǰ¶ËºÍºó¶ËͨÐŵÄÐÒéÔÚPostgreSQLµÄ¹Ù·½ÎĵµÖеġ¶Ç°¶ËºÍºó¶ËµÄͨÐÅÐÒé¡·Ò»ÕÂÖÐÓÐÏêϸµÄ˵Ã÷¡£¼òµ¥À´Ëµ£¬´óÌåµÄ¹¤×÷ģʽÊÇ£ºÇ°¶ËÏòºó¶Ë·¢ËͲéѯµÄSQLÎÄ£¬È»ºóºó¶Ëͨ¹ý¸´Êý¸ö±¨Îİѽá¹û·µ»Ø¸øÇ°¶Ë¡£
ÓÉÓÚÐèÒª½øÐÐÁ¬½ÓµÄ³õʼ»¯¡¢´íÎóµÈ¸÷ÖÖ¸÷Ñù´¦Àí£¬PostgreSQLµÄÐÒéµÄ´¦ÀíÒ²ÊÇÏ൱¸´ÔÓ£¬Èç¹ûÒª×Ô¼º´ÓͷʵÏÖÕâЩÐÒéµÄ´¦ÀíµÄ»°£¬»¹ÊÇÏ൱Âé·³µÄ£¬ËùÒÔPostgreSQL±¾ÉíÌṩÁËCÓïÑÔдµÄlibpqÕâÑùÒ»¸öÐÒé´¦Àí¿â£¬ÀûÓÃÕâ¸ö¿â¿ÉÒԱȽÏÇáËɵغͺó¶Ë½øÐÐͨÐÅ¡£PostgreSQLµÄ»°³ýÁËCÒÔÍ⣬»¹Ö§³ÖPerlºÍPHPµÈÆäËûÓïÑÔ£¬ÕâЩÓïÑÔÔÚÄÚ²¿Ò²µ÷ÓÃÁËlibpq.
Ò²Óв»Ê¹ÓÃlibpq¶øÖ±½ÓÓëPostgreSQLͨÐŵĿ⡣±È½Ï¾ßÓдú±íÐÔµÄÊÇJava, PostgreSQLµÄJDBCÇý¶¯ÊDz»ÒÀÀµÓÚlibpqÖ±½ÓÓëPostgreSQLͨÐŵÄ.
ÁíÍâºó¶ËµÄ»°£¬±È½ÏºËÐĵÄÊǽøÐÐÊý¾Ý¿â´¦ÀíµÄÊý¾Ý¿âÒýÇæ(Database Engine)¡£ Êý¾Ý¿âÒýÇæ¿ÉÒÔ¶ÔÓû§Ëù±àдµÄº¯Êý½øÐнâÎöºÍ´¦Àí£¬Óû§Èç¹ûÄܹ»ÀûÓúÃÕâ¸ö¹¦Äܵϰ£¬¿ÉÒÔÈáÈíµØÀ©Õ¹PostgreSQLµÄ¹¦ÄÜ¡£
±È½Ï¾³£Ê¹ÓõÄÊÇ´æ´¢¹ý³Ì(PostgreSQLÖгÆÎªÓû§×Ô¶¨Ò庯Êý)£¬PostgreSQLÖ§³ÖµÄÓû§¶¨Ò庯ÊýµÄÓïÑÔÈçÏ£º
ÓïÑÔ ¶ÔÓ¦µÄ×Ô¶¨Ò庯Êý
C Cº¯Êý
SQL SQL º¯Êý
ÀàËÆOracleµÄPL/SQLµÄÓïÑÔ PL/pgSQL
Perl PL/Perl
Python PL/Python |
PostgreSQLµÄ»°£¬Óû§¿ÉÒÔ×Ô¶¨ÒåÓïÑÔ´¦ÀíÒýÇæ¡£¸÷ÖÖ·þÎñÆ÷½Å±¾ÓïÑԵĽâÎöÒýÇæ£¬ÒÔµÚÈý·½µÄÐÎʽ´æÔÚ£¬Ö÷ÒªµÄ´¦ÀíÓïÑÔÓÐRuby¡¢JavaÒÔ¼°PHPµÈ¡£
PostgreSQLµÄ½á¹¹
ÕâÀïµÄ»°£¬ÔÙÏêϸ¿´¿´PostgreSQLµÄ½á¹¹¡£ ºó¶ËÓɼ¸¸ö½ø³Ì¹¹³É¡£

Potgres(³£×¤½ø³Ì)
¹ÜÀíºó¶ËµÄ³£×¤½ø³Ì£¬Ò²³ÆÎª¡¯postmaster¡¯¡£ÆäĬÈϼàÌýUNIX Domain SocketºÍTCP/IP£¨WindowsµÈ£¬Ò»²¿·ÖµÄƽֻ̨¼àÌýtcp/ip£©µÄ5432¶Ë¿Ú£¬µÈ´ýÀ´×Ôǰ¶ËµÄµÄÁ¬½Ó´¦Àí¡£¼àÌýµÄ¶Ë¿ÚºÅ¿ÉÒÔÔÚPostgreSQLµÄÉèÖÃÎļþpostgresql.confÀïÃæ¿ÉÒԸġ£
Ò»µ©ÓÐǰ¶ËÁ¬½Ó¹ýÀ´£¬postgres»áͨ¹ýfork(2)Éú³É×Ó½ø³Ì¡£Ã»ÓÐFork(2)µÄwindowsƽ̨µÄ»°£¬ÔòÀûÓÃcreateProcess()Éú³ÉеĽø³Ì¡£ÕâÖÖÇéÐεϰ£¬ºÍfork(2)²»Í¬µÄÊÇ£¬¸¸½ø³ÌµÄÊý¾Ý²»»á±»¼Ì³Ð¹ýÀ´£¬ËùÒÔÐèÒªÀûÓù²ÏíÄÚ´æ°Ñ¸¸½ø³ÌµÄÊý¾Ý¼Ì³Ð¹ýÀ´¡£
Postgres(×Ó½ø³Ì)
×Ó½ø³Ì¸ù¾Ýpg_hba.conf¶¨ÒåµÄ°²È«²ßÂÔÀ´ÅжÏÊÇ·ñÔÊÐí½øÐÐÁ¬½Ó£¬¸ù¾Ý²ßÂÔ£¬»á¾Ü¾øÄ³Ð©Ìض¨µÄIP¼°ÍøÂ磬»òÕßÒ²¿ÉÒÔÖ»ÔÊÐíÄ³Ð©ÌØ¶¨µÄÓû§»òÕß¶ÔijЩÊý¾Ý¿â½øÐÐÁ¬½Ó¡£
Postgres»á½ÓÊÜǰ¶Ë¹ýÀ´µÄ²éѯ£¬È»ºó¶ÔÊý¾Ý¿â½øÐмìË÷£¬×îºÃ°Ñ½á¹û·µ»Ø£¬ÓÐʱҲ»á¶ÔÊý¾Ý¿â½øÐиüС£¸üеÄÊý¾Ýͬʱ»¹»á¼Ç¼ÔÚÊÂÎñÈÕÖ¾ÀïÃæ£¨PostgreSQL³ÆÎªWALÈÕÖ¾£©£¬Õâ¸öÖ÷ÒªÊǵ±Í£µçµÄʱºò£¬·þÎñÆ÷µ±»ú£¬ÖØÐÂÆô¶¯µÄʱºò½øÐлָ´´¦ÀíµÄʱºòʹÓõġ£ÁíÍ⣬°ÑÈÕÖ¾¹éµµ±£´æÆðÀ´£¬¿ÉÔÚÐèÒª½øÐлָ´µÄʱºòʹÓá£ÔÚPostgreSQL
9.0ÒÔºó£¬Í¨¹ý°ÑWALÈÕÖ¾´«ËÍÆäËûµÄpostgreSQL£¬¿ÉÒÔʵʱµÃ½øÐÐÊý¾Ý¿â¸´ÖÆ£¬Õâ¾ÍÊÇËùνµÄ¡®Êý¾Ý¿â¸´ÖÆ¡¯¹¦ÄÜ¡£
ÆäËûµÄ½ø³Ì
PostgresÖ®Í⻹ÓÐһЩ¸¨ÖúµÄ½ø³Ì¡£ÕâЩ½ø³Ì¶¼ÊÇÓɳ£×¤postgresÆô¶¯µÄ½ø³Ì¡£
Writer process
Writer processÔÚÊʵ±µÄʱ¼äµã°Ñ¹²ÏíÄÚ´æÉϵĻº´æÐ´Íù´ÅÅÌ¡£Í¨¹ýÕâ¸ö½ø³Ì£¬¿ÉÒÔ·ÀÖ¹ÔÚ¼ì²éµãµÄʱºò(checkpoint),´óÁ¿µÄÍù´ÅÅÌд¶øµ¼ÖÂÐÔÄܶñ»¯£¬Ê¹µÃ·þÎñÆ÷¿ÉÒÔ±£³Ö±È½ÏÎȶ¨µÄÐÔÄÜ¡£Background
writerÆðÀ´ÒÔºó¾ÍÒ»Ö±³£×¤Äڴ棬µ«ÊDz¢·ÇÒ»Ö±ÔÚ¹¤×÷£¬Ëü»áÔÚ¹¤×÷Ò»¶Îʱ¼äºó½øÐÐÐÝÃߣ¬ÐÝÃßµÄʱ¼ä¼ä¸ôͨ¹ýpostgresql.confÀïÃæµÄ²ÎÊýbgwriter_delayÉèÖã¬Ä¬ÈÏÊÇ200΢Ãë¡£
Õâ¸ö½ø³ÌµÄÁíÍâÒ»¸öÖØÒªµÄ¹¦ÄÜÊǶ¨ÆÚÖ´Ðмì²éµã(checkpoint)¡£
¼ì²éµãµÄʱºò£¬»á°Ñ¹²ÏíÄÚ´æÉϵĻº´æÄÚÈÝÍùÊý¾Ý¿âÎļþд£¬Ê¹µÃÄÚ´æºÍÎļþµÄ״̬һÖ¡£Í¨¹ýÕâÑù£¬¿ÉÒÔÔÚϵͳ±ÀÀ£µÄʱºò¿ÉÒÔËõ¶Ì´ÓWAL»Ö¸´µÄʱ¼ä£¬ÁíÍâÒ²¿ÉÒÔ·ÀÖ¹WALÎÞÏÞµÄÔö³¤¡£
¿ÉÒÔͨ¹ýpostgresql.confµÄcheckpoint_segments¡¢checkpoint_timeoutÖ¸¶¨Ö´Ðмì²éµãµÄʱ¼ä¼ä¸ô¡£
WAL writer process
WAL writer process°Ñ¹²ÏíÄÚ´æÉϵÄWAL»º´æÔÚÊʵ±µÄʱ¼äµãÍù´ÅÅÌд£¬Í¨¹ýÕâÑù£¬¿ÉÒÔ¼õÇáºó¶Ë½ø³ÌÔÚд×Ô¼ºµÄWAL»º´æÊ±µÄѹÁ¦£¬Ìá¸ßÐÔÄÜ¡£ÁíÍ⣬·Çͬ²½Ìá½»ÉèΪtrueµÄʱºò£¬¿ÉÒÔ±£Ö¤ÔÚÒ»¶¨µÄʱ¼ä¼ä¸ôÄÚ£¬°ÑWAL»º´æÉϵÄÄÚÈÝдÈëWALÈÕÖ¾Îļþ¡£
Archive process
Archive process°ÑWALÈÕÖ¾×ªÒÆµ½¹éµµÈÕÖ¾Àï¡£Èç¹û±£´æÁË»ù´¡±¸·ÝÒÔ¼°¹éµµÈÕÖ¾£¬¼´Ê¹ÊµÔÚ´ÅÅÌÍêÈ«Ë𻵵Äʱºò£¬Ò²¿ÉÒԻظ´Êý¾Ý¿âµ½×îеÄ״̬¡£
stats collector process
ͳ¼ÆÐÅÏ¢µÄÊÕ¼¯½ø³Ì¡£ÊÕ¼¯ºÃͳ¼Æ±íµÄ·ÃÎÊ´ÎÊý£¬´ÅÅ̵ķÃÎÊ´ÎÊýµÈÐÅÏ¢¡£ÊÕ¼¯µ½µÄÐÅÏ¢³ýÁËÄܱ»autovaccumÀûÓ㬻¹¿ÉÒÔ¸øÆäËûÊý¾Ý¿â¹ÜÀíÔ±×÷ΪÊý¾Ý¿â¹ÜÀíµÄ²Î¿¼ÐÅÏ¢¡£
Logger process
°ÑpostgresqlµÄ»î¶¯×´Ì¬Ð´µ½ÈÕÖ¾ÐÅÏ¢Îļþ£¨²¢·ÇÊÂÎñÈÕÖ¾£©£¬ÔÚÖ¸¶¨µÄʱ¼ä¼ä¸ôÀïÃæ£¬¶ÔÈÕÖ¾Îļþ½øÐÐrotate.
AutovacuumÆô¶¯½ø³Ì
autovacuum launcher processÊÇÒÀÀµÓÚpostmaster¼ä½ÓÆô¶¯vacuum½ø³Ì¡£¶øÆä×ÔÉíÊDz»Ö±½ÓÆô¶¯×Ô¶¯vacuum½ø³ÌµÄ¡£Í¨¹ýÕâÑù¿ÉÒÔÌá¸ßϵͳµÄ¿É¿¿ÐÔ¡£
×Ô¶¯vacuum½ø³Ì
autovacuum worker process½ø³Ìʵ¼ÊÖ´ÐÐvacuumµÄÈÎÎñ¡£ÓÐʱºò»áͬʱÆô¶¯¶à¸övacuum½ø³Ì¡£
wal sender / wal receiver
wal sender ½ø³ÌºÍwal receiver½ø³ÌÊÇʵÏÖpostgresql¸´ÖÆ(streaming
replication)µÄ½ø³Ì¡£Wal sender½ø³Ìͨ¹ýÍøÂç´«ËÍWALÈÕÖ¾£¬¶øÆäËûPostgreSQLʵÀýµÄwal
receiver½ø³ÌÔò½ÓÊÕÏàÓ¦µÄÈÕÖ¾¡£Wal receiver½ø³ÌµÄËÞÖ÷PostgreSQL£¨Ò²³ÆÎªStandby£©½ÓÊܵ½WALÈÕÖ¾ºó£¬ÔÚ×ÔÉíµÄÊý¾Ý¿âÉÏ»¹Ô£¬Éú³ÉÒ»¸öºÍ·¢ËͶ˵ÄPostgreSQL(Ò²³ÆÎªMaster)ÍêȫһÑùµÄÊý¾Ý¿â¡£
ºó¶ËµÄ´¦ÀíÁ÷³Ì
ÏÂÃæ¿´¿´Êý¾Ý¿âÒýÇæpostgres×Ó½ø³ÌµÄ´¦Àí¸ÅÒª¡£ÎªÁ˼òµ¥Æð¼ûÏÂÃæµÄ˵Ã÷ÖУ¬°Ñbackend process¼ò³ÆÎªbackend¡£BackendµÄmainº¯ÊýÊÇPostgresMain
(tcop/postgres.c)¡£
½ÓÊÕǰ¶Ë·¢Ë͹ýÀ´µÄ²éѯ(SQLÎÄ)
SQLÎÄÊǵ¥´¿µÄÎÄ×Ö£¬µçÄÔÊÇÈÏʶ²»Á˵ģ¬ËùÒÔҪת»»³É±È½ÏÈÝÒ×´¦ÀíµÄÄÚ²¿ÐÎʽ¹¹ÎÄÊ÷parser tree,Õâ¸ö´¦ÀíµÄ³ÆÎª¹¹ÎĽâÎö¡£¹¹ÎĽâÎöµÄÄ£¿é³ÆÎªparser.Õâ¸ö½×¶ÎÖ»Äܹ»Ê¹ÓÃÎÄ×Ö×ÖÃæÉϵÃÀ´µÄÐÅÏ¢£¬ËùÒÔֻҪûÓï·¨´íÎóÖ®ÀàµÄ´íÎ󣬼´Ê¹ÊÇselect²»´æÔڵıíÒ²²»»á±¨´í¡£Õâ¸ö½×¶ÎµÄ¹¹ÎÄÊ÷±»³ÆÎªraw
parse tree. ¹¹ÎÄ´¦ÀíµÄÈë¿ÚÔÚraw_parser (parser/parser.c)¡£
¹¹ÎÄÊ÷½âÎöÍêÒԺ󣬻áת»»Îª²éѯÊ÷(Query tree)¡£Õâ¸öʱºò£¬»á·ÃÎÊÊý¾Ý¿â£¬¼ì²é±íÊÇ·ñ´æÔÚ£¬Èç¹û´æÔڵϰ£¬Ôò°Ñ±íÃûת»»ÎªOID¡£Õâ¸ö´¦Àí³ÆÎª·ÖÎö´¦Àí(Analyze),
½øÐзÖÎö´¦ÀíµÄÄ£¿éÊÇanalyzer¡£ ÁíÍ⣬PostgreSQLµÄ´úÂëÀïÃæÌáµ½¹¹ÎÄÊ÷parser
treeµÄʱºò£¬¸ü¶àµÄʱºòÊÇÖ¸²éѯÊ÷Query tree¡£·ÖÎö´¦ÀíµÄÄ£¿éµÄÈë¿ÚÔÚparse_analyze
(parser/analyze.c)
PostgreSQL»¹Í¨¹ý²éѯÓï¾äµÄÖØÐ´ÊµÏÖÊÓͼ(view)ºÍ¹æÔò(rule), ËùÒÔÐèÒªµÄʱºò£¬ÔÚÕâ¸ö½×¶Î»á¶Ô²éѯÓï¾ä½øÐÐÖØÐ´¡£Õâ¸ö´¦Àí³ÆÎªÖØÐ´(rewrite)£¬ÖØÐ´µÄÈë¿ÚÔÚQueryRewrite
(rewrite/rewriteHandler.c)¡£
ͨ¹ý½âÎö²éѯÊ÷£¬¿ÉÒÔʵ¼ÊÉú³É¼Æ»®Ê÷¡£Éú³É²éѯÊ÷µÄ´¦Àí³ÆÎª¡®Ö´Ðмƻ®´¦Àí¡¯£¬×î¹Ø¼üÊÇÒªÉú³É¹À¼ÆÄÜÔÚ×î¶ÌµÄʱ¼äÄÚÍê³ÉµÄ¼Æ»®Ê÷(plan
tree)¡£Õâ¸ö²½Öè³ÆÎª¡¯²éѯÓÅ»¯¡¯(²»½Ðquery optimize, ¶øÊÇoptimize),
¶øÍê³ÉÕâ¸ö´¦ÀíµÄÄ£¿é³ÆÎª²éѯÓÅ»¯Æ÷(²»½Ðquery optimizer,¶øÊÇoptimizer, »òÕß³ÆÎªplanner)¡£Ö´Ðмƻ®´¦ÀíµÄÈë¿ÚÔÚstandard_planner
(optimizer/plan/planner.c)¡£
°´ÕÕÖ´Ðмƻ®ÀïÃæµÄ²½Öè¿ÉÒÔÍê³É²éѯҪ´ïµ½µÄÄ¿µÄ¡£ÔËÐÐÖ´Ðмƻ®Ê÷ÀïÃæ²½ÖèµÄ´¦Àí³ÆÎªÖ´Ðд¦Àí¡®execute¡¯,
Íê³ÉÕâ¸ö´¦ÀíµÄÄ£¿é³ÆÎªÖ´ÐÐÆ÷¡®Executor¡¯, Ö´ÐÐÆ÷µÄÈë¿ÚµØÖ·Îª£¬ExecutorRun (executor/execMain.c)
Ö´Ðнá¹û·µ»Ø¸øÇ°¶Ë¡£
·µ»Øµ½²½ÖèÒ»ÖØ¸´Ö´ÐС£
PostgreSQLµÄÔ´Âë
ÏÖÔÚ»ù±¾ÉÏÀí½âÁËPostgreSQLµÄ´óÌåµÄ½á¹¹£¬ÎÒÃÇÔÙÀ´¿´¿´PostgreSQL´úÂëµÄ½á¹¹¡£ PostgreSQL³õÆÚµÄʱºò£¬´ó¸ÅÖ»ÓÐ20ÍòÐÐ×óÓҵĴúÂ룬ÏÖÔÚÒѾ·¢Õ¹µ½100ÍòÐÐÁË¡£Õâ¸öÁ¿À´Ëµ£¬Ã»ÓÐÖ¸µ¼¶ÁÆðÀ´ÊǼ«ÎªÄÑÀí½âµÄ£¬ÕâÀï°Ñ´ó¸ÅµÄ´úÂë½á¹¹ËµÃ÷һϣ¬Èôó¼Ò¶ÔÔ´ÂëµÄ½á¹¹ÓиöÀí½â¡£
µÚÒ»¼¶Ä¿Â¼½á¹¹
½øÈëPostgreSQLµÄÔ´ÂëĿ¼ºó£¬µÚÒ»¼¶µÄ½á¹¹ÈçϱíËùʾ¡£ÔÚÕâÒ»¼¶Àͨ¹ýÖ´ÐÐÈçÏÂÃüÁîconfigure;make;make
install¿ÉÒÔÁ¢¼´½øÐмòµ¥µÄ°²×°£¬Êµ¼ÊÉÏ´ÓPostgreSQLÔ´Âë°²×°ÊǼ«Îª¼òµ¥µÄ¡£
ÎļþĿ¼ ˵Ã÷
COPYRIGHT °æÈ¨ÐÅÏ¢
GUNMakefile µÚÒ»¼¶Ä¿Â¼µÄ Makefile
GUNMakefile.in Makefile µÄ³ûÐÎ
HISTORY ÐÞ¸ÄÀúÊ·
INSTALL °²×°·½·¨¼òҪ˵Ã÷
Makefile MakefileÄ£°æ
README ¼òµ¥ËµÃ÷
aclocal.m4 config ÓõÄÎļþµÄÒ»²¿·Ö
config/ config ÓõÄÎļþµÄĿ¼
configure configure Îļþ
configure.in configure ÎļþµÄ³ûÐÎ
contrib/ contribution ³ÌÐò
doc/ ÎĵµÄ¿Â¼
src/ Ô´´úÂëĿ¼ |
PostgreSQL µÄsrcÏÂÃæÓС£
ÎļþĿ¼ ˵Ã÷
DEVELOPERS ÃæÏò¿ª·¢ÈËÔ±µÄ×¢ÊÓ
Makefile Makefile
Makefile.global make µÄÉ趨ֵ£¨´ÓconfigureÉú³ÉµÄ£©
Makefile.global.in ConfigureʹÓõÄMakefile.globalµÄ³ûÐÎ
Makefile.port ƽ̨Ïà¹ØµÄmakeµÄÉ趨ֵ£¬Êµ¼ÊÊÇÒ»¸öµ½makefile/MakefileµÄÁ¬½Ó.
£¨´ÓconfigureÉú³ÉµÄ£©
Makefile.shlib ¹²Ïí¿âÓõÄMakefile
backend/ ºó¶ËµÄÔ´ÂëĿ¼
bcc32.mak Win32 ¥Ý©`¥ÈÓäΠMakefile (Borland C++ ÓÃ)
bin/ psql µÈ UNIXÃüÁîµÄ´úÂë
include/ Í·Îļþ
interfaces/ ǰ¶ËÏà¹ØµÄ¿âµÄ´úÂë
makefiles/ ƽ̨Ïà¹ØµÄmake µÄÉèÖÃÖµ
nls-global.mk ÐÅϢĿ¼ÓõÄMakefileÎļþµÄ¹æÔò
pl/ ´æ´¢¹ý³ÌÓïÑԵĴúÂë
port/ Æ½Ì¨ÒÆÖ²Ïà¹ØµÄ´úÂë
template/ ƽ̨Ïà¹ØµÄÉèÖÃÖµ
test/ ¸÷ÖÖ²âÊԽű¾
timezone/ Ê±ÇøÏà¹Ø´úÂë
tools/ ¸÷×Ô¿ª·¢¹¤¾ßºÍÎĵµ
tutorial/ ½Ì³Ì
win32.mak Win32 ¥Ý©`¥ÈÓäΠMakefile (Visual C++ ÓÃ)
|
win32.mak Win32 ¥Ý©`¥ÈÓäΠMakefile (Visual C++ ÓÃ)
ÕâÀï±È½ÏºËÐĵÄÊÇbackend,bin,interfaceÕ⼸¸öĿ¼¡£BackendÊǶÔÓ¦ÓÚºó¶Ë£¬binºÍinterface¶ÔÓ¦ÓÚǰ¶Ë¡£
binÀïÃæÓÐpgsql,initdb,pg_dumpµÈ¸÷ÖÖ¹¤¾ßµÄ´úÂë¡£interfaceÀïÃæÓÐPostgreSQLµÄCÓïÑԵĿâlibpq,ÁíÍâ¿ÉÒÔÔÚCÀïǶÈëSQLµÄECPGÃüÁîµÄÏà¹Ø´úÂë¡£
BackendĿ¼µÄ½á¹¹ÈçÏ£º
Ŀ¼Îļþ ˵Ã÷
Makefile makefile
access/ ¸÷ÖÖ´æ´¢·ÃÎÊ·½·¨(ÔÚ¸÷¸ö×ÓĿ¼ÏÂ) common(¹²Í¬º¯Êý)¡¢gin (Generalized
Inverted IndexͨÓÃÄæÏòË÷Òý)
gist (Generalized Search TreeͨÓÃË÷Òý)¡¢ hash (¹þÏ£Ë÷Òý)¡¢heap
(heapµÄ·ÃÎÊ·½·¨)¡¢
index (ͨÓÃË÷Òýº¯Êý)¡¢ nbtree (Btreeº¯Êý)¡¢transam (ÊÂÎñ´¦Àí)
bootstrap/ Êý¾Ý¿âµÄ³õʼ»¯´¦Àí(initdbµÄʱºò)
catalog/ ϵͳĿ¼
commands/ SELECT/INSERT/UPDATE/DELETEÒÔΪµÄSQLÎĵĴ¦Àí
executor/ Ö´ÐÐÆ÷(·ÃÎʵÄÖ´ÐÐ)
foreign/ FDW(Foreign Data Wrapper)´¦Àí
lib/ ¹²Í¬º¯Êý
libpq/ ǰ¶Ë/ºó¶ËͨÐÅ´¦Àí
main/ postgresµÄÖ÷º¯Êý
nodes/ ¹¹ÎÄÊ÷½ÚµãÏà¹ØµÄ´¦Àíº¯Êý
optimizer/ ÓÅ»¯Æ÷
parser/ SQL¹¹ÎĽâÎöÆ÷
port/ ƽ̨Ïà¹ØµÄ´úÂë
postmaster/ postmasterµÄÖ÷º¯Êý (³£×¤postgres)
replication/ streaming replication
regex/ ÕýÔò´¦Àí
rewrite/ ¹æÔò¼°ÊÓͼÏà¹ØµÄÖØÐ´´¦Àí
snowball/ È«ÎļìË÷Ïà¹Ø£¨Óï¸É´¦Àí£©
storage/ ¹²ÏíÄÚ´æ¡¢´ÅÅÌÉϵĴ洢¡¢»º´æµÈÈ«²¿Ò»´Î/¶þ´Î¼Ç¼¹ÜÀí(ÒÔϵÄĿ¼)buffer/(»º´æ¹ÜÀí)¡¢
file/(Îļþ)¡¢
freespace/(Fee Space Map¹ÜÀí) ipc/(½ø³Ì¼äͨÐÅ)¡¢large_object
/(´ó¶ÔÏóµÄ·ÃÎʺ¯Êý)¡¢
lmgr/(Ëø¹ÜÀí)¡¢page/(Ò³Ãæ·ÃÎÊÏà¹Øº¯Êý)¡¢ smgr/(´æ´¢¹ÜÀíÆ÷)
tcop/ postgres (Êý¾Ý¿âÒýÇæµÄ½ø³Ì)µÄÖ÷Òª²¿·Ö
tsearch/ È«ÎļìË÷
utils/ ¸÷ÖÖÄ£¿é(ÒÔÏÂĿ¼) adt/(ǶÈëµÄÊý¾ÝÀàÐÍ)¡¢cache/(»º´æ¹ÜÀí)¡¢
error/(´íÎó´¦Àí)¡¢fmgr/(º¯Êý¹ÜÀí)¡¢
hash/(hashº¯Êý)¡¢ init/(Êý¾Ý¿â³õʼ»¯¡¢postgresµÄ³õÆÚ´¦Àí)¡¢ mb/(¶à×Ö½ÚÎÄ×Ö´¦Àí)¡¢
misc/(ÆäËû)¡¢mmgr/(ÄÚ´æµÄ¹ÜÀíº¯Êý)¡¢ resowner/(²éѯ´¦ÀíÖеÄÊý¾Ý(buffer
pin¼°±íËø)µÄ¹ÜÀí)¡¢
sort/(ÅÅÐò´¦Àí)¡¢time/(ÊÂÎñµÄ MVCC ¹ÜÀí) |
backendµÈµÄ´úÂëµÄÍ·Îļþ°üº¬ÔÚincludeÀïÃæ¡£Æä×éÖ¯ËäÈ»ÓëbackendµÄĿ¼½á¹¹ÀàËÆ£¬µ«ÊDz¢·ÇÍêÈ«Ïàͬ£¬»ù±¾ÉÏÀ´ËµÏÂÒ»¼¶µÄ×ÓĿ¼²»ÔÙÉèÏÂÒ»¼¶Ä¿Â¼¡£ÀýÈçbackendµÄĿ¼ÏÂÃæÓÐutilsÕâ¸öĿ¼£¬¶øutilÏÂÃæ»¹ÓÐadtÕâ¸ö×ÓĿ¼£¬µ«ÊÇincludeÀïÃæÊ¡ÂÔÁËÕâ¸öĿ¼£¬±ä³ÉÁË±âÆ½µÄ½á¹¹¡£
access/
bootstrap/
c.h
catalog/
commands/
dynloader.h
executor/
fmgr.h
foreign/
funcapi.h
getaddrinfo.h
getopt_long.h
lib/
libpq/
mb/
miscadmin.h
nodes/
optimizer/
parser/
pg_config.h
pg_config.h.in
pg_config.h.win32
pg_config_manual.h
pg_config_os.h
pg_trace.h
pgstat.h
pgtime.h
port/
port.h
portability/
postgres.h
postgres_ext.h
postgres_fe.h
postmaster/
regex/
rewrite/
rusagestub.h
snowball/
stamp-h
storage/
tcop/
tsearch/
utils/
windowapi.h |
´úÂëµÄÔĶÁ·½·¨
Óõ÷ÊÔÆ÷×·×Ù´úÂë
PostgreSQLÄÇÑùµÄÅÓ´óϵͳ£¬ÓÃÑÛ¾¦À´×·×ÙÔ´Âë²¢²»ÈÝÒס£ÕâÀïÍÆ¼öÓÃgdbÕâÑùµÄʵ¼Êµ÷ÊÔÆ÷À´×·×Ù´úÂëµÄÖ´ÐÐÁ÷³Ì¡£¿ÉÄÜÓÐЩÈËη¾åµ÷ÊÔÆ÷£¬µ«ÊÇÈç¹ûÖ»ÊǼòµ¥×·×Ù´úÂëµÄÖ´ÐÐÁ÷µÄ»°£¬»¹ÊǺܼòµ¥µÄ¡£
µ«ÊǶàÉÙ»¹ÊÇÒª×öһЩ׼±¸µÄ£¬PostgreSQLÔÚ±àÒëµÄʱºòÒ»¶¨Òª°Ñµ÷ÊÔ¿ª¹Ø´ò¿ª¡£Í¨³£ÔÚ±àÒëµÄʱºòconfigureµÄʱºò¼ÓÉÏ--enable-debugµÄÑ¡ÏȻºó¿ÉÄܵϰ¿ÉÒÔ±à¼src/Makefile.globalÕâ¸öÎļþ
CFLAGS = -O2
-Wall -Wmissing-prototypes -Wpointer-arith \
-Wdeclaration-after-statement -Wendif-labels -Wformat-security
\
-fno-strict-aliasing -fwrapv |
ÉÏÃæµÄÐеÄ"-O2"Ñ¡Ïîɾ³ý£¬È»ºó¼ÓÉÏ"-g"
CFLAGS = -g -Wall
-Wmissing-prototypes -Wpointer-arith \
-Wdeclaration-after-statement -Wendif-labels -Wformat-security
\
-fno-strict-aliasing -fwrapv |
"-O2"ÊDZàÒëÆ÷µÄÓÅ»¯Ñ¡ÏÈç¹û´ò¿ªÁË£¬´úÂëµÄÖ´ÐÐ˳Ðò»á¸Ä±ä£¬Ê¹µÃ×·×ÙÆð´úÂëÀ´±È½ÏÀ§ÄÑ£¬ËùÒÔҪȥ³ý¡£µ±È»ÕâÑùµÄ»°£¬±àÒëºóµÄ¿ÉÖ´ÐÐÎļþ»á±È½Ï´ó£¬¶øÇÒ»á±È½ÏÂý£¬Éú²ú»·¾³²»Ì«ºÏÊÊ¡£´ó¼ÒÐèÒªÀí½âÕâ¸ö²Ù×÷½ö½öÊÇÔÚѧϰµÄʱºò¶øÉèÖõġ£
ʵ¼ÊʹÓÃgdbÊÔÊÔ
ÏÂÃæÊµ¼ÊʹÓÃgdbÀ´¿´¿´±È½Ï¼òµ¥µãµÄselectÎÄ¡£
selectÎÄÖ´Ðкó£¬ÖÁexecutorµÄÆäÖÐÒ»¸öº¯ÊýExecSelectÍ£Ö¹£¬È»ºóÎÒÃǵ÷²éÒ»ÏÂʵ¼Êµ÷ÓÃÁËÄÇЩº¯Êý¡£
Ê×ÏÈÒÔPostgreSQLµÄ³¬¼¶Óû§µÇ¼¡£ÎҵĻ·¾³ÊÇʹÓÃt-ishiiÕâ¸öÓû§°²×°PostgreSQLµÄ£¬Í¨³£Ò»°ãʹÓÃpostgresÕâ¸öÓû§£¬´ó¼ÒÔÚÔĶÁµÄʱºòÌæ»»Ò»Ï¼´¿É¡£
È»ºó£¬ÓÃpsqlºÍÊý¾Ý¿â½øÐÐÁ¬½Ó£¬Á¬½ÓµÄ״̬¿ÉÒÔͨ¹ýpsÃüÁîµ÷²é¡£
$ ps x
3714 ? Ss 0:00 postgres: t-ishii test [local]
idle |
¿ÉÒÔ¿´µ½ÉÏÃæµÄ½ø³Ì¡£Õâ¸ö¾ÍÊǺó¶ËµÄ½ø³Ì¡£Õâ¸öÊǺó¶ËµÄ½ø³Ì£¬»¹ÓÐÆäËû´óÁ¿Óû§µÄPostgreSQLµÄÁ¬½ÓÒ²ÏÔʾ³öÀ´£¬±È½ÏÄÑ¿´Çå³þ£¬ËùÒÔ»¹ÊÇ×¼±¸ºÃ²âÊԵĻ·¾³À´½øÐвâÊԱȽϺá£
Æô¶¯gdbºó£¬¸½¼Óµ½psÀïÏÔʾµÄ½ø³ÌºÅÂë¡£
$ gdb postgres
3714
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change
and redistribute it.
There is NO WARRANTY, to the extent permitted
by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-vine-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/local/pgsql/bin/postgres...done.
Attaching to program: /usr/local/pgsql/bin/postgres,
process 3714
Reading symbols from /lib64/libdl.so.2...done.
Loaded symbols for /lib64/libdl.so.2
Reading symbols from /lib64/libm.so.6...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libc.so.6...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /lib64/libnss_files.so.2...done.
Loaded symbols for /lib64/libnss_files.so.2
0x00007fad266f82e2 in __libc_recv (fd=<value
optimized out>, buf=0xbe9900,
n=8192, flags=<value optimized out>)
at ../sysdeps/unix/sysv/linux/x86_64/recv.c:30
30 ../sysdeps/unix/sysv/linux/x86_64/recv.c:
in ../sysdeps/unix/sysv/linux/x86_64/recv.c
(gdb) |
(gdb) ÊÇgdbµÄÃüÁîÐС£ÔÚÕâ¸ö״̬Ï£¬¿ÉÒÔ½ÓÊÜgdbµÄÃüÁÈç¹ûÊäÈëbÃüÁîµÄ»°£¬ÔÚExecResult¿ÉÒÔÉèÖöϵ㡣
(gdb) b ExecResult
Breakpoint 1, ExecResult (node=0xd13eb0) at nodeResult.c:75
(gdb) |
psqlÆô¶¯ÒÔºó´ÓÖÕ¶ËÖ´ÐÐselect 1,ÊäÈëÒԺ󣬺ó¶Ë¾Í»áÖ´ÐиÃÃüÁî¡£Õâ¸öʱºò£¬postgres½ø³ÌÒѾÔÝÍ££¬ËùÒÔpsql»á¶¯²»ÁË¡£Òª¼ÌÐøÖ´Ðеϰ£¬¿ÉÔÚgdbÀïÖ´ÐÐ"c"ÃüÁî¡£Ö´ÐÐÁËÒԺ󣬾ͻáÔÚExecResult
´¦Í£Ö¹¡£
Continuing.
Breakpoint 1, ExecResult (node=0xd13eb0) at
nodeResult.c:75
75 econtext = node->ps.ps_ExprContext;
(gdb) |
µ½ExecSelectΪֹµÄº¯ÊýµÄµ÷Ó÷¾¶¿ÉÒÔÓÃbtµÄÃüÁîÏÔʾ³öÀ´¡£
(gdb) bt
#0 ExecResult (node=0xd13eb0) at nodeResult.c:75
#1 0x00000000005b92a4 in ExecProcNode (node=0xd13eb0)
at execProcnode.c:367
#2 0x00000000005b71bb in ExecutePlan (estate=0xd13da0,
planstate=0xd13eb0,
operation=CMD_SELECT, sendTuples=1 '\001', numberTuples=0,
direction=ForwardScanDirection, dest=0xcf9938)
at execMain.c:1439
#3 0x00000000005b5835 in standard_ExecutorRun
(queryDesc=0xc62820,
direction=ForwardScanDirection, count=0) at execMain.c:313
#4 0x00000000005b5729 in ExecutorRun (queryDesc=0xc62820,
direction=ForwardScanDirection, count=0) at execMain.c:261
#5 0x00000000006d2f79 in PortalRunSelect (portal=0xc60810,
forward=1 '\001', count=0, dest=0xcf9938) at pquery.c:943
#6 0x00000000006d2c4e in PortalRun (portal=0xc60810,
count=9223372036854775807, isTopLevel=1 '\001',
dest=0xcf9938,
altdest=0xcf9938, completionTag=0x7fffa4b0eeb0
"") at pquery.c:787
#7 0x00000000006cd135 in exec_simple_query
(query_string=0xcf8420 "select 1;")
at postgres.c:1018
#8 0x00000000006d1144 in PostgresMain (argc=2,
argv=0xc42da0,
username=0xc42c40 "t-ishii") at postgres.c:3926
#9 0x0000000000683ced in BackendRun (port=0xc65600)
at postmaster.c:3600
#10 0x00000000006833dc in BackendStartup (port=0xc65600)
at postmaster.c:3285
#11 0x0000000000680759 in ServerLoop () at postmaster.c:1454
#12 0x000000000067ff4d in PostmasterMain (argc=3,
argv=0xc40e00)
at postmaster.c:1115
#13 0x00000000005f7a39 in main (argc=3, argv=0xc40e00)
at main.c:199
(gdb) |
˵Ã÷һϿ´µÄ·½·¨£¬·¢Æðµ÷Óõĺ¯ÊýÔÚÏÂÃæ£¬±»µ÷Óõĺ¯ÊýÔÚÉÏÃæ¡£Ò²¾ÍÊÇExecProcNodeµ÷ÓÃÁËExecResult£¬ExecutePlanµ÷ÓÃÁËExecProcNode£¬ExecutorRunµ÷ÓÃÁËExecProcNode£¬ÕâÑùµÄÐÎʽÀ´Ð´¡£ÌرðÊÇÖмäµÄµÚ7ÐС£
#7 0x00000000006cd135
in exec_simple_query
(query_string=0xcf8420 "select 1;")
at postgres.c:1018 |
ÕâÑù¿ÉÒÔÇå³þ¿´µ½ÔÚ´¦ÀíSELECTÎÄ¡£:)×Ðϸ¿´gdbµÄÊä³ö£¬¿ÉÒÔ·¢ÏÖÕâЩϸ½Ú¡£
gdbÊÇÔ´Âëµ÷ÊÔÆ÷£¬ËùÒÔ¿ÉÒÔ¿´µ½ºÍÔ´´úÂëµÄ¶ÔÓ¦¹ØÏµ¡£ÀýÈçlistÃüÁî¿ÉÒÔ¿´µ½ÏÖÔÚÖ´ÐеÄÐи½½üµÄ´úÂë¡£
(gdb) list
70 TupleTableSlot *resultSlot;
71 PlanState *outerPlan;
72 ExprContext *econtext;
73 ExprDoneCond isDone;
74
75 econtext = node->ps.ps_ExprContext;
76
77 /*
78 * check constant qualifications like (2 >
1), if not already done
79 */ |
ÀûÓÃupÃüÁî¿ÉÒÔÍùÉÏÃæµÄº¯ÊýÒÆ¶¯¡£ÏÂÃæÓÃlistÃüÁ¿ÉÒÔÈ·ÈÏʵ¼Êµ÷ÓÃExecSelect µÄµØ·½¡£
(gdb) up
#1 0x00000000005b92a4 in ExecProcNode (node=0xd13eb0)
at execProcnode.c:367
367 result = ExecResult((ResultState *) node);
(gdb) list
362 {
363 /*
364 * control nodes
365 */
366 case T_ResultState:
367 result = ExecResult((ResultState *) node);
368 break;
369
370 case T_ModifyTableState:
371 result = ExecModifyTable((ModifyTableState
*) node); |
ÀûÓÃdown¿ÉÒÔÍùÏÂÃæµÄº¯ÊýÒÆ¶¯¡£ÀûÓÃupºÍdownµÄ×éºÏ£¬¿ÉÒÔµ÷²éº¯ÊýµÄµ÷ÓùØÏµ¡£
ÒªÍ˳ögdbµÄ»°¿ÉÒÔÓÃquit¡£
µ½ÁËÕâÀïgdb¾Í½áÊøÁË£¬µ«ÊǺó¶Ë½ø³Ì²¢²»»áÖÕÖ¹¡£
ʹÓÃtagÀ´Ìø×ªµ½ÏàÓ¦µÄº¯Êý¶¨ÒåÎļþ
ÎÒÃÇÒѾʹÓÃÁËgdbÀ´µ÷²épostgreSQLµÄÔËÐУ¬ÁíÍâÓÃgdbµÄlistÀ´×·×ÙÔ´ÂëµÄ»°»¹ÊÇÏ൱ÐÁ¿àµÄ£¬Ò»°ãÀ´ËµÓÃemacsµÈ±à¼Æ÷Ò»Æðµ÷²éºÍä¯ÀÀ´úÂ룬¿ÉÒÔÔڱߵ÷ÊԱ߲鿴´úÂë¡£
µ±È»£¬ÔÚgdbģʽÏÂÒ²¿ÉÒÔʹÓá£Õâ¸öʱºò£¬ÀýÈçÈç¹ûÏë¿´¿´'exec_simple_query'µÄ¶¨ÒåµÄ»°£¬Ê¹ÓÃemacsµÄtagsÃüÁî¿ÉÒÔÁ¢¿ÌÌø×ªµ½º¯Êý¶¨ÒåµÄµØ·½¡£ÒªÊ¹ÓÃtagsµÄ»°£¬ÐèÒªÉú²útagsÎļþ£¬PostgreSQLµÄ»°£¬´øÓÐÉú²útagsÎļþµÄ½Å±¾¡£
$ cd /usr/local/src/postgresql-9.1.1/src
$ tools/make_etags (ʹÓÃemacsµÄ³¡ºÏ)
$ tools/make_tags (ʹÓÃviµÄ³¡ºÏ) |
ÕâÑù¾Í¿ÉÒÔÀ¡£ È»ºóÔÚemacsÖУ¬ÔÚexec_simple_query ´¦Ö´ÐÐ'ESC-.'(°´ÁËESC¼üºóÊäÈ붺ºÅ.)£¬¼´¿É´ò¿ª¹â±êËùÔÚÎÄ×ÖËùÔÚµÄexec_simple_queryº¯ÊýµÄ¶¨ÒåÎļþ¡£
×ܽá
ÒªÍêÈ«Àí½âPostgreSQLµÄ»°£¬Í¨¹ýµ÷²éÔ´´úÂ뻹ÊDZȽÏÓÐЧ¹ûµÄ¡£ÒªÀí½â´úÂëµÄ»°£¬¿ÉÒÔ°´ÕÕÄ¿µÄ×Ô¼º×·¼Ó±ØÒªµÄ¹¦ÄÜ£¬¸Ä±äһЩ¹¦ÄܵÄÐÐΪ£¬´ó¼Ò¿ÉÒÔ×î´óÏ޶ȵĵÄÏíÊÜ¿ªÔ´´øÀ´µÄºÃ´¦¡£ |