diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 431b06568bd61803be3a35063afbb4accf1a58f0..b16232a0b529b03aab18dca9bfaef2303796398d 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.336 2010/07/29 11:06:34 sriggs Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.337 2010/07/29 19:23:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -7230,11 +7230,20 @@ static void
 copy_relation_data(SMgrRelation src, SMgrRelation dst,
 				   ForkNumber forkNum, bool istemp)
 {
+	char	   *buf;
+	Page		page;
 	bool		use_wal;
 	BlockNumber nblocks;
 	BlockNumber blkno;
-	char		buf[BLCKSZ];
-	Page		page = (Page) buf;
+
+	/*
+	 * palloc the buffer so that it's MAXALIGN'd.  If it were just a local
+	 * char[] array, the compiler might align it on any byte boundary, which
+	 * can seriously hurt transfer speed to and from the kernel; not to
+	 * mention possibly making log_newpage's accesses to the page header fail.
+	 */
+	buf = (char *) palloc(BLCKSZ);
+	page = (Page) buf;
 
 	/*
 	 * We need to log the copied data in WAL iff WAL archiving/streaming is
@@ -7263,6 +7272,8 @@ copy_relation_data(SMgrRelation src, SMgrRelation dst,
 		smgrextend(dst, forkNum, blkno, buf, true);
 	}
 
+	pfree(buf);
+
 	/*
 	 * If the rel isn't temp, we must fsync it down to disk before it's safe
 	 * to commit the transaction.  (For a temp rel we don't care since the rel